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