/* FUNCTION <>---create a temporary file INDEX tmpfile INDEX _tmpfile_r ANSI_SYNOPSIS #include FILE *tmpfile(void); FILE *_tmpfile_r(struct _reent *<[reent]>); TRAD_SYNOPSIS #include FILE *tmpfile(); FILE *_tmpfile_r(<[reent]>) struct _reent *<[reent]>; DESCRIPTION Create a temporary file (a file which will be deleted automatically), using a name generated by <>. 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 alternate function <<_tmpfile_r>> is a reentrant version. The argument <[reent]> is a pointer to a reentrancy structure. RETURNS <> normally returns a pointer to the temporary file. If no temporary file could be created, the result is NULL, and <> records the reason for failure. PORTABILITY Both ANSI C and the System V Interface Definition (Issue 2) require <>. Supporting OS subroutines required: <>, <>, <>, <>, <>, <>, <>, <>, <>. <> also requires the global pointer <>. */ #include <_ansi.h> #include #include #include #include #ifndef O_BINARY # define O_BINARY 0 #endif FILE * _DEFUN(_tmpfile_r, (ptr), 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 = _open_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 = _fdopen_r (ptr, fd, "wb+"); e = ptr->_errno; if (!fp) _close_r (ptr, fd); _CAST_VOID _remove_r (ptr, f); ptr->_errno = e; return fp; } #ifndef _REENT_ONLY FILE * _DEFUN_VOID(tmpfile) { return _tmpfile_r (_REENT); } #endif