94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
| FUNCTION
 | |
| <<tmpfile64>>---create a large temporary file
 | |
| 
 | |
| INDEX
 | |
| 	tmpfile64
 | |
| INDEX
 | |
| 	_tmpfile64_r
 | |
| 
 | |
| SYNOPSIS
 | |
| 	#include <stdio.h>
 | |
| 	FILE *tmpfile64(void);
 | |
| 
 | |
| 	FILE *_tmpfile64_r(void *<[reent]>);
 | |
| 
 | |
| DESCRIPTION
 | |
| Create a large temporary file (a file which will be deleted automatically),
 | |
| using a name generated by <<tmpnam>>.  The temporary file is opened with
 | |
| the mode <<"wb+">>, permitting you to read and write anywhere in it
 | |
| as a binary file (without any data transformations the host system may
 | |
| perform for text files).  The file may be larger than 2GB.
 | |
| 
 | |
| The alternate function <<_tmpfile64_r>> is a reentrant version.  The
 | |
| argument <[reent]> is a pointer to a reentrancy structure.
 | |
| 
 | |
| Both <<tmpfile64>> and <<_tmpfile64_r>> are only defined if __LARGE64_FILES
 | |
| is defined.
 | |
| 
 | |
| RETURNS
 | |
| <<tmpfile64>> normally returns a pointer to the temporary file.  If no
 | |
| temporary file could be created, the result is NULL, and <<errno>>
 | |
| records the reason for failure.
 | |
| 
 | |
| PORTABILITY
 | |
| <<tmpfile64>> is a glibc extension.
 | |
| 
 | |
| Supporting OS subroutines required: <<close>>, <<fstat>>, <<getpid>>,
 | |
| <<isatty>>, <<lseek64>>, <<open64>>, <<read>>, <<sbrk>>, <<write>>.
 | |
| 
 | |
| <<tmpfile64>> also requires the global pointer <<environ>>.
 | |
| */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <reent.h>
 | |
| #include <errno.h>
 | |
| #include <fcntl.h>
 | |
| #include <sys/stat.h>
 | |
| 
 | |
| #ifndef O_BINARY
 | |
| # define O_BINARY 0
 | |
| #endif
 | |
| 
 | |
| #ifdef __LARGE64_FILES
 | |
| 
 | |
| FILE *
 | |
| _tmpfile64_r (struct _reent *ptr)
 | |
| {
 | |
|   FILE *fp;
 | |
|   int e;
 | |
|   char *f;
 | |
|   char buf[L_tmpnam];
 | |
|   int fd;
 | |
| 
 | |
|   do
 | |
|   {
 | |
|      if ((f = _tmpnam_r (ptr, buf)) == NULL)
 | |
| 	return NULL;
 | |
|       fd = _open64_r (ptr, f, O_RDWR | O_CREAT | O_EXCL | O_BINARY,
 | |
| 		      S_IRUSR | S_IWUSR);
 | |
|   }
 | |
|   while (fd < 0 && ptr->_errno == EEXIST);
 | |
|   if (fd < 0)
 | |
|     return NULL;
 | |
|   fp = _fdopen64_r (ptr, fd, "wb+");
 | |
|   e = ptr->_errno;
 | |
|   if (!fp)
 | |
|     _close_r (ptr, fd);
 | |
|   (void) _remove_r (ptr, f);
 | |
|   ptr->_errno = e;
 | |
|   return fp;
 | |
| }
 | |
| 
 | |
| #ifndef _REENT_ONLY
 | |
| 
 | |
| FILE *
 | |
| tmpfile64 (void)
 | |
| {
 | |
|   return _tmpfile64_r (_REENT);
 | |
| }
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif /* __LARGE64_FILES */
 |