diff options
Diffstat (limited to 'newlib/libc/sys/linux/pwrite64.c')
-rw-r--r-- | newlib/libc/sys/linux/pwrite64.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/newlib/libc/sys/linux/pwrite64.c b/newlib/libc/sys/linux/pwrite64.c new file mode 100644 index 000000000..fddd6d2da --- /dev/null +++ b/newlib/libc/sys/linux/pwrite64.c @@ -0,0 +1,62 @@ +/* +FUNCTION +<<pwrite64>>---write a large file from specified position + +INDEX + pwrite64 + +ANSI_SYNOPSIS + #include <unistd.h> + ssize_t pwrite64(int <[fd]>, void *<[buf]>, size_t <[n]>, loff_t <[off]>); + +TRAD_SYNOPSIS + #include <unistd.h> + ssize_t pwrite64(<[fd]>, <[buf]>, <[n]>, <[off]>) + int <[fd]>; + void *<[buf]>; + size_t <[n]>; + loff_t <[off]>; + +DESCRIPTION +The <<pwrite64>> function is similar to <<pwrite>>. The only difference is +that it operates on large files and so takes a 64-bit offset. Like <<pwrite>>>, +the file position is unchanged by the function (i.e. the file position +is the same before and after a call to <<pwrite>>). + +RETURNS +<<pwrite64>> returns the number of bytes written or <<-1>> if failure occurred. + +PORTABILITY +<<pwrite64>> is an EL/IX extension. + +Supporting OS subroutine required: <<write64>>, <<lseek64>>. +*/ + +#include <_ansi.h> +#include <unistd.h> +#include <reent.h> + +ssize_t +_DEFUN (pwrite64, (fd, buf, n, off), + int fd _AND + _PTR buf _AND + size_t n _AND + loff_t off) +{ + loff_t cur_pos; + _READ_WRITE_RETURN_TYPE num_written; + + if ((cur_pos = lseek64 (fd, 0, SEEK_CUR)) == (loff_t)-1) + return -1; + + if (lseek64 (fd, off, SEEK_SET) == (loff_t)-1) + return -1; + + num_written = write64 (fd, buf, n); + + if (lseek64 (fd, cur_pos, SEEK_SET) == (loff_t)-1) + return -1; + + return (ssize_t)num_written; +} + |