- int e;
- char *f, buf[MAXPATHLEN];
-
- if ((f = tmpnam(buf)) == NULL)
- return (NULL);
- fp = fopen(f, "w+");
- e = errno;
- (void) unlink(f);
- errno = e;
- return (fp);
+ int fd, sverrno;
+#define TRAILER "tmp.XXXXXX"
+ char buf[sizeof(_PATH_TMP) + sizeof(TRAILER)];
+
+ bcopy(_PATH_TMP, buf, sizeof(_PATH_TMP) - 1);
+ bcopy(TRAILER, buf + sizeof(_PATH_TMP) - 1, sizeof(TRAILER));
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGHUP);
+ sigaddset(&set, SIGINT);
+ sigaddset(&set, SIGQUIT);
+ sigaddset(&set, SIGTERM);
+ (void)sigprocmask(SIG_BLOCK, &set, &oset);
+
+ fd = mkstemp(buf);
+ if (fd != -1)
+ (void)unlink(buf);
+
+ (void)sigprocmask(SIG_SETMASK, &oset, (sigset_t *)NULL);
+
+ if (fd == -1)
+ return(NULL);
+
+ if (!(fp = fdopen(fd, "w+"))) {
+ sverrno = errno;
+ (void)close(fd);
+ errno = sverrno;
+ return(NULL);
+ }
+ return(fp);