xref: /csrg-svn/lib/libc/stdio/tmpfile.c (revision 46559)
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