diff --git a/include/unistd.h b/include/unistd.h index df28fff57..a6405f2ee 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -147,6 +147,7 @@ _PROTOTYPE( int tcsetpgrp, (int _fd, pid_t _pgrp_id) ); _PROTOTYPE( char *ttyname, (int _fd) ); _PROTOTYPE( int unlink, (const char *_path) ); _PROTOTYPE( ssize_t write, (int _fd, const void *_buf, size_t _n) ); +_PROTOTYPE( ssize_t pwrite, (int _fd, const void *_buf, size_t _n, off_t _offset)); _PROTOTYPE( int truncate, (const char *_path, off_t _length) ); _PROTOTYPE( int ftruncate, (int _fd, off_t _length) ); _PROTOTYPE( int nice, (int _incr) ); diff --git a/lib/libc/posix/Makefile.inc b/lib/libc/posix/Makefile.inc index 7c6833c25..7b40f7877 100644 --- a/lib/libc/posix/Makefile.inc +++ b/lib/libc/posix/Makefile.inc @@ -107,4 +107,5 @@ SRCS+= \ nice.c \ priority.c \ pread.c \ + pwrite.c \ usleep.c diff --git a/lib/libc/posix/pwrite.c b/lib/libc/posix/pwrite.c new file mode 100644 index 000000000..7cb3f52c4 --- /dev/null +++ b/lib/libc/posix/pwrite.c @@ -0,0 +1,26 @@ +#include +#include + +ssize_t pwrite(int fd, const void *buffer, size_t nbytes, off_t where) +{ + off_t here; + ssize_t w; + + if((here = lseek(fd, 0, SEEK_CUR)) < 0) + return -1; + + if(lseek(fd, where, SEEK_SET) < 0) + return -1; + + if((w=write(fd, buffer, nbytes)) < 0) { + int e = errno; + lseek(fd, here, SEEK_SET); + errno = e; + return -1; + } + + if(lseek(fd, here, SEEK_SET) < 0) + return -1; + + return w; +}