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:
pgpym11SwP8yS.pgp
Description: PGP signature