146111Sbostic /*- 246111Sbostic * Copyright (c) 1990 The Regents of the University of California. 346111Sbostic * All rights reserved. 446111Sbostic * 546111Sbostic * This code is derived from software contributed to Berkeley by 646111Sbostic * Chris Torek. 746111Sbostic * 846111Sbostic * %sccs.include.redist.c% 946111Sbostic */ 1046111Sbostic 1146111Sbostic #if defined(LIBC_SCCS) && !defined(lint) 12*46559Sbostic static char sccsid[] = "@(#)tmpfile.c 5.2 (Berkeley) 02/22/91"; 1346111Sbostic #endif /* LIBC_SCCS and not lint */ 1446111Sbostic 15*46559Sbostic #include <sys/types.h> 16*46559Sbostic #include <signal.h> 17*46559Sbostic #include <errno.h> 1846111Sbostic #include <stdio.h> 19*46559Sbostic #include <paths.h> 2046111Sbostic 2146111Sbostic FILE * 2246111Sbostic tmpfile() 2346111Sbostic { 24*46559Sbostic sigset_t set, oset; 2546111Sbostic FILE *fp; 26*46559Sbostic int fd, sverrno; 27*46559Sbostic #define TRAILER "tmp.XXXXXX" 28*46559Sbostic char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)]; 2946111Sbostic 30*46559Sbostic bcopy(_PATH_TMP, buf, sizeof(_PATH_TMP) - 1); 31*46559Sbostic bcopy(TRAILER, buf + sizeof(_PATH_TMP) - 1, sizeof(TRAILER)); 32*46559Sbostic 33*46559Sbostic sigemptyset(&set); 34*46559Sbostic sigaddset(&set, SIGHUP); 35*46559Sbostic sigaddset(&set, SIGINT); 36*46559Sbostic sigaddset(&set, SIGQUIT); 37*46559Sbostic sigaddset(&set, SIGTERM); 38*46559Sbostic (void)sigprocmask(SIG_BLOCK, &set, &oset); 39*46559Sbostic 40*46559Sbostic fd = mkstemp(buf); 41*46559Sbostic if (fd != -1) 42*46559Sbostic (void)unlink(buf); 43*46559Sbostic 44*46559Sbostic (void)sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL); 45*46559Sbostic 46*46559Sbostic if (fd == -1) 47*46559Sbostic return(NULL); 48*46559Sbostic 49*46559Sbostic if (!(fp = fdopen(fd, "w+"))) { 50*46559Sbostic sverrno = errno; 51*46559Sbostic (void)close(fd); 52*46559Sbostic errno = sverrno; 53*46559Sbostic return(NULL); 54*46559Sbostic } 55*46559Sbostic return(fp); 5646111Sbostic } 57