static FILE *
build_temporary_file()
{
- int old_umask;
- FILE *afp;
+ FILE *afp;
- build_temporary_name();
- signal(SIGINT, interrupt);
+ signal(SIGINT, interrupt);
#ifdef SIGHUP
- signal(SIGHUP, interrupt);
+ signal(SIGHUP, interrupt);
#endif
- old_umask = umask(077);
- afp = xfopen(temporary_name, WRITE_BINARY);
- remove_temporary_at_error = TRUE;
- temporary_fp = afp;
- umask(old_umask);
+ remove_temporary_at_error = TRUE;
+ temporary_fd = build_temporary_name();
+ if (fd == -1)
+ fatal_error(temporary_name);
- return afp;
+ afp = fdopen(temporary_name, WRITE_BINARY);
+ if (afp == NULL)
+ fatal_error(temporary_name);
+
+
+ return afp;
}
/* ------------------------------------------------------------------------ */
fatal_error(msg)
char *msg;
{
- message_1("Fatal error:", "", msg);
+ message_1("Fatal error:", "", msg);
- if (remove_temporary_at_error)
- unlink(temporary_name);
+ if (remove_temporary_at_error) {
+ if (temporary_fd != -1)
+ close(temporary_fd);
+ unlink(temporary_name);
+ }
- exit(1);
+ exit(1);
}
/* ------------------------------------------------------------------------ */
errno = 0;
message("Interrupted\n", "");
- if (temporary_fp)
- fclose(temporary_fp);
+ if (temporary_fd != -1)
+ close(temporary_fd);
unlink(temporary_name);
if (recover_archive_when_interrupt)
rename(backup_archive_name, archive_name);
/* */
/* ------------------------------------------------------------------------ */
/* Build temporary file name and store to TEMPORARY_NAME */
-void
+int
build_temporary_name()
{
#ifdef TMP_FILENAME_TEMPLATE
else {
sprintf(temporary_name, "%s/lhXXXXXX", extract_directory);
}
-#ifdef HAVE_MKSTEMP
- mkstemp(temporary_name);
-#else
- mktemp(temporary_name);
-#endif
#else
char *p, *s;
if (*p == '/')
s = p;
strcpy((s ? s + 1 : temporary_name), "lhXXXXXX");
+#endif
#ifdef HAVE_MKSTEMP
- mkstemp(temporary_name);
+ return mkstemp(temporary_name);
#else
mktemp(temporary_name);
-#endif
+ return open(temporary_name, O_CREAT|O_EXCL|O_RDWR|O_BINARY, 0600);
#endif
}