1 /*- 2 * Copyright (c) 1990 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Chris Torek. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #if defined(LIBC_SCCS) && !defined(lint) 12 static char sccsid[] = "@(#)tmpfile.c 5.2 (Berkeley) 02/22/91"; 13 #endif /* LIBC_SCCS and not lint */ 14 15 #include <sys/types.h> 16 #include <signal.h> 17 #include <errno.h> 18 #include <stdio.h> 19 #include <paths.h> 20 21 FILE * 22 tmpfile() 23 { 24 sigset_t set, oset; 25 FILE *fp; 26 int fd, sverrno; 27 #define TRAILER "tmp.XXXXXX" 28 char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)]; 29 30 bcopy(_PATH_TMP, buf, sizeof(_PATH_TMP) - 1); 31 bcopy(TRAILER, buf + sizeof(_PATH_TMP) - 1, sizeof(TRAILER)); 32 33 sigemptyset(&set); 34 sigaddset(&set, SIGHUP); 35 sigaddset(&set, SIGINT); 36 sigaddset(&set, SIGQUIT); 37 sigaddset(&set, SIGTERM); 38 (void)sigprocmask(SIG_BLOCK, &set, &oset); 39 40 fd = mkstemp(buf); 41 if (fd != -1) 42 (void)unlink(buf); 43 44 (void)sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL); 45 46 if (fd == -1) 47 return(NULL); 48 49 if (!(fp = fdopen(fd, "w+"))) { 50 sverrno = errno; 51 (void)close(fd); 52 errno = sverrno; 53 return(NULL); 54 } 55 return(fp); 56 } 57