xref: /csrg-svn/contrib/sort/tmp.c (revision 62249)
160913Sbostic /*-
2*62249Sbostic  * Copyright (c) 1993
3*62249Sbostic  *	The Regents of the University of California.  All rights reserved.
460913Sbostic  *
560913Sbostic  * This code is derived from software contributed to Berkeley by
660913Sbostic  * Peter McIlroy.
760913Sbostic  *
860913Sbostic  * %sccs.include.redist.c%
960913Sbostic  */
1060913Sbostic 
1160913Sbostic #ifndef lint
12*62249Sbostic static char sccsid[] = "@(#)tmp.c	8.1 (Berkeley) 06/06/93";
1360913Sbostic #endif /* not lint */
1460913Sbostic 
1560913Sbostic #include <sys/param.h>
1660913Sbostic 
1760913Sbostic #include <err.h>
1860913Sbostic #include <errno.h>
1960913Sbostic #include <limits.h>
2060913Sbostic #include <signal.h>
2160913Sbostic #include <stdio.h>
2260913Sbostic #include <stdlib.h>
2360913Sbostic #include <string.h>
2460913Sbostic #include <unistd.h>
2560913Sbostic 
2660913Sbostic #include "pathnames.h"
2760913Sbostic 
2860913Sbostic #define _NAME_TMP "sort.XXXXXXXX"
2960913Sbostic 
3060913Sbostic FILE *
ftmp()3160913Sbostic ftmp()
3260913Sbostic {
3360913Sbostic 	static char *envtmp;
3460913Sbostic 	sigset_t set, oset;
3560913Sbostic 	static int first = 0;
3660913Sbostic 	FILE *fd;
3760913Sbostic 	char pathb[_POSIX_PATH_MAX], *path;
3860913Sbostic 
3960913Sbostic 	path = pathb;
4060913Sbostic 	if (!first && !envtmp) {
4160913Sbostic 		envtmp = getenv("TMPDIR");
4260913Sbostic 		first = 1;
4360913Sbostic 	}
4460913Sbostic 	if (envtmp)
4560913Sbostic 		(void)snprintf(path,
4660913Sbostic 		    sizeof(pathb), "%s/%s", envtmp, _NAME_TMP);
4760913Sbostic 	else {
4860913Sbostic 		memmove(path, _PATH_SORTTMP, sizeof(_PATH_SORTTMP));
4960913Sbostic 	}
5060913Sbostic 	sigfillset(&set);
5160913Sbostic 	(void)sigprocmask(SIG_BLOCK, &set, &oset);
5260913Sbostic 	path = mktemp(path);
5360913Sbostic 	if (!path)
5460913Sbostic 		err(2, "%s");
5560913Sbostic 	if (!(fd = fopen(path, "w+")))
5660913Sbostic 		err(2, "%s", path);
5760913Sbostic 	(void)unlink(path);
5860913Sbostic 
5960913Sbostic 	(void)sigprocmask(SIG_SETMASK, &oset, NULL);
6060913Sbostic 	return (fd);
6160913Sbostic };
62