[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [tyndur-devel] [PATCH 1/6] libc: POSIX: pread() und pwrite()



On Mon, Jan 05 22:23, Kevin Wolf wrote:
> + libc: POSIX: pread() und pwrite()
> ---
>  src/modules/include/unistd.h        |    6 +++++
>  src/modules/lib/posix/posix_files.c |   41 +++++++++++++++++++++++++++++++++++
>  2 files changed, 47 insertions(+), 0 deletions(-)
> 
> diff --git a/src/modules/include/unistd.h b/src/modules/include/unistd.h
> index fa7dc2a..341b363 100644
> --- a/src/modules/include/unistd.h
> +++ b/src/modules/include/unistd.h
> @@ -115,6 +115,12 @@ char* mktemp(char* template);
>  /// Temporaere Datei anlegen
>  int mkstemp(char* template);
>  
> +/// In eine Datei mit gegebenem Offset lesen
> +ssize_t pread(int fd, void *buf, size_t count, off_t offset);
> +
> +/// In eine Datei mit gegebenem Offset schreiben
> +ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
> +
>  #ifndef CONFIG_LIBC_NO_STUBS
>  /// Prozess klonen
>  pid_t fork(void);
> diff --git a/src/modules/lib/posix/posix_files.c b/src/modules/lib/posix/posix_files.c
> index bfa3601..659de16 100644
> --- a/src/modules/lib/posix/posix_files.c
> +++ b/src/modules/lib/posix/posix_files.c
> @@ -346,6 +346,47 @@ int close(int fd)
>      return 0;
>  }
>  
> +/// In eine Datei mit gegebenem Offset lesen
> +ssize_t pread(int fd, void *buf, size_t count, off_t offset)
> +{
> +    FILE* file = fd_to_file(fd);
> +    off_t old_pos;
> +    ssize_t ret;
> +
> +    // Bei einem ungueltigen Deskriptor wird abgebrochen
> +    if (file == NULL) {
> +        errno = EBADF;
> +        return -1;
> +    }
> +
> +    old_pos = ftell(file);
> +    fseek(file, offset, SEEK_SET);

Politisch korrekt müsste wohl hier der Rückgabewert geprüft werden...

> +    ret = read(fd, buf, count);

Nimm hier besser fread, dann sparen wir einmal Deskriptor raussuchen.

> +    fseek(file, old_pos, SEEK_SET);
> +
> +    return ret;
> +}
> +
> +/// In eine Datei mit gegebenem Offset schreiben
> +ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset)
> +{
> +    FILE* file = fd_to_file(fd);
> +    off_t old_pos;
> +    ssize_t ret;
> +
> +    // Bei einem ungueltigen Deskriptor wird abgebrochen
> +    if (file == NULL) {
> +        errno = EBADF;
> +        return -1;
> +    }
> +
> +    old_pos = ftell(file);
> +    fseek(file, offset, SEEK_SET);
> +    ret = write(fd, buf, count);

Hier gilt das Selbe.

> +    fseek(file, old_pos, SEEK_SET);
> +
> +    return ret;
> +}
>  
>  #ifndef CONFIG_LIBC_NO_STUBS
>  /**
> -- 
> 1.5.4.5
> 
> _______________________________________________
> tyndur-devel mailing list
> tyndur-devel@xxxxxxxxxx
> http://list.tyndur.org/mailman/listinfo/tyndur-devel
> 

-- 
Antoine Kaufmann
<toni@xxxxxxxxxxxxxxxx>

Attachment: pgpSqPNhBQApA.pgp
Description: PGP signature