| #ifndef _NO_PWRITE |
| /* |
| FUNCTION |
| <<pwrite>>---write a file from specified position |
| |
| INDEX |
| pwrite |
| INDEX |
| _pwrite_r |
| |
| ANSI_SYNOPSIS |
| #include <unistd.h> |
| ssize_t pwrite(int <[fd]>, const void *<[buf]>, |
| size_t <[n]>, off_t <[off]>); |
| ssize_t _pwrite_r(struct _reent *<[rptr]>, int <[fd]>, |
| const void *<[buf]>, size_t <[n]>, off_t <[off]>); |
| |
| TRAD_SYNOPSIS |
| #include <unistd.h> |
| ssize_t pwrite(<[fd]>, <[buf]>, <[n]>, <[off]>) |
| int <[fd]>; |
| const void *<[buf]>; |
| size_t <[n]>; |
| off_t <[off]>; |
| |
| ssize_t _pwrite_r(<[rptr]>, <[fd]>, <[buf]>, <[n]>, <[off]>) |
| struct _reent *<[rptr]>; |
| int <[fd]>; |
| const void *<[buf]>; |
| size_t <[n]>; |
| off_t <[off]>; |
| |
| DESCRIPTION |
| The <<pwrite>> function is similar to <<write>>. One difference is that |
| <<pwrite>> has an additional parameter <[off]> which is the offset to |
| position in the file before writing. The function also differs in that |
| the file position is unchanged by the function (i.e. the file position |
| is the same before and after a call to <<pwrite>>). |
| |
| The <<_pwrite_r>> function is the same as <<pwrite>>, only a reentrant |
| struct pointer <[rptr]> is provided to preserve reentrancy. |
| |
| RETURNS |
| <<pwrite>> returns the number of bytes written or <<-1>> if failure occurred. |
| |
| PORTABILITY |
| <<pwrite>> is non-ANSI and is specified by the Single Unix Specification. |
| |
| Supporting OS subroutine required: <<write>>, <<lseek>>. |
| */ |
| |
| #include <_ansi.h> |
| #include <unistd.h> |
| #include <reent.h> |
| |
| ssize_t |
| _DEFUN (_pwrite_r, (rptr, fd, buf, n, off), |
| struct _reent *rptr _AND |
| int fd _AND |
| _CONST _PTR buf _AND |
| size_t n _AND |
| off_t off) |
| { |
| off_t cur_pos; |
| _READ_WRITE_RETURN_TYPE num_written; |
| |
| if ((cur_pos = _lseek_r (rptr, fd, 0, SEEK_CUR)) == (off_t)-1) |
| return -1; |
| |
| if (_lseek_r (rptr, fd, off, SEEK_SET) == (off_t)-1) |
| return -1; |
| |
| num_written = _write_r (rptr, fd, buf, n); |
| |
| if (_lseek_r (rptr, fd, cur_pos, SEEK_SET) == (off_t)-1) |
| return -1; |
| |
| return (ssize_t)num_written; |
| } |
| |
| #ifndef _REENT_ONLY |
| |
| ssize_t |
| _DEFUN (pwrite, (fd, buf, n, off), |
| int fd _AND |
| _CONST _PTR buf _AND |
| size_t n _AND |
| off_t off) |
| { |
| return _pwrite_r (_REENT, fd, buf, n, off); |
| } |
| |
| #endif /* !_REENT_ONLY */ |
| #endif /* !_NO_PWRITE */ |