65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
| 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: <<write>>, <<lseek64>>.
 | |
| */
 | |
| 
 | |
| #include <_ansi.h>
 | |
| #include <unistd.h>
 | |
| #include <reent.h>
 | |
| #include <machine/weakalias.h>
 | |
| 
 | |
| ssize_t
 | |
| _DEFUN (__libc_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 = write (fd, buf, n);
 | |
| 
 | |
|   if (lseek64 (fd, cur_pos, SEEK_SET) == (loff_t)-1)
 | |
|     return -1;
 | |
| 
 | |
|   return (ssize_t)num_written;
 | |
| }
 | |
| weak_alias(__libc_pwrite64,pwrite64)
 | |
| 
 |