95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
| #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  */
 |