From 39d45901b349d70579241a01327f7fb2d7f1973d Mon Sep 17 00:00:00 2001 From: Jeffrey A Law Date: Sun, 28 Jun 1998 20:07:32 +0000 Subject: [PATCH] choose-temp.c (choose_temp_base): Restore original variant of this function for compatibility. * choose-temp.c (choose_temp_base): Restore original variant of this function for compatibility. (make_temp_file): This is the new, preferred interface to create temporary files. * collect2.c (choose_temp_base): Delete declaration. (make_temp_file): Declare. (temp_filename_length, temp_filename): Delete. (main): Use make_temp_file to get temporary files. Use --lang-c to force the resulting ctort/dtor file to be compiled with the C compiler. Make sure to remove temporary files on all exit paths. * gcc.c (make_temp_file): Provide prototype if MKTEMP_EACH_FILE is defined. (choose_temp_base): Only provide prototype if MKTEMP_EACH_FILE is not defined. (do_spec): Use make_temp_file if MKTEMP_EACH_FILE is defined. From-SVN: r20784 --- gcc/ChangeLog | 18 +++++++++++++++++ gcc/choose-temp.c | 51 +++++++++++++++++++++++++++++++++++++++++++++-- gcc/collect2.c | 30 +++++++++++----------------- gcc/gcc.c | 9 +++++++-- 4 files changed, 86 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3bc9e92beeb..225395a8fec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,21 @@ +Sun Jun 28 20:58:51 1998 Jeffrey A Law (law@cygnus.com) + + * choose-temp.c (choose_temp_base): Restore original variant of + this function for compatibility. + (make_temp_file): This is the new, preferred interface to create + temporary files. + * collect2.c (choose_temp_base): Delete declaration. + (make_temp_file): Declare. + (temp_filename_length, temp_filename): Delete. + (main): Use make_temp_file to get temporary files. Use --lang-c + to force the resulting ctort/dtor file to be compiled with the C + compiler. Make sure to remove temporary files on all exit paths. + * gcc.c (make_temp_file): Provide prototype if MKTEMP_EACH_FILE is + defined. + (choose_temp_base): Only provide prototype if MKTEMP_EACH_FILE is + not defined. + (do_spec): Use make_temp_file if MKTEMP_EACH_FILE is defined. + Sun Jun 28 08:57:09 1998 Kaveh R. Ghazi * configure.in (GCC_NEED_DECLARATIONS): Add strerror, getcwd and diff --git a/gcc/choose-temp.c b/gcc/choose-temp.c index 1cc933c2574..e012c6a4b79 100644 --- a/gcc/choose-temp.c +++ b/gcc/choose-temp.c @@ -17,7 +17,7 @@ License along with libiberty; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* This file exports one function: choose_temp_base. */ +/* This file exports two functions: choose_temp_base and make_temp_file. */ /* This file lives in at least two places: libiberty and gcc. Don't change one without the other. */ @@ -102,10 +102,57 @@ try (dir, base) /* Return a prefix for temporary file names or NULL if unable to find one. The current directory is chosen if all else fails so the program is exited if a temporary directory can't be found (mktemp fails). - The buffer for the result is obtained with xmalloc. */ + The buffer for the result is obtained with xmalloc. + + This function is provided for backwards compatability only. It use + is not recommended. */ char * choose_temp_base () +{ + char *base = 0; + char *temp_filename; + int len; + static char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 }; + static char usrtmp[] = { DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 }; + + base = try (getenv ("TMPDIR"), base); + base = try (getenv ("TMP"), base); + base = try (getenv ("TEMP"), base); + +#ifdef P_tmpdir + base = try (P_tmpdir, base); +#endif + + /* Try /usr/tmp, then /tmp. */ + base = try (usrtmp, base); + base = try (tmp, base); + + /* If all else fails, use the current directory! */ + if (base == 0) + base = "."; + + len = strlen (base); + temp_filename = xmalloc (len + 1 /*DIR_SEPARATOR*/ + + strlen (TEMP_FILE) + 1); + strcpy (temp_filename, base); + + if (len != 0 + && temp_filename[len-1] != '/' + && temp_filename[len-1] != DIR_SEPARATOR) + temp_filename[len++] = DIR_SEPARATOR; + strcpy (temp_filename + len, TEMP_FILE); + + mktemp (temp_filename); + if (strlen (temp_filename) == 0) + abort (); + return temp_filename; +} +/* Return a temporary file name (as a string) or NULL if unable to create + one. */ + +char * +make_temp_file () { char *base = 0; char *temp_filename; diff --git a/gcc/collect2.c b/gcc/collect2.c index a766bd25834..7c6e2b3adc0 100644 --- a/gcc/collect2.c +++ b/gcc/collect2.c @@ -60,7 +60,7 @@ Boston, MA 02111-1307, USA. */ #define WEXITSTATUS(S) (((S) & 0xff00) >> 8) #endif -extern char *choose_temp_base (); +extern char *make_temp_file (); /* On certain systems, we have code that works by scanning the object file directly. But this code uses system-specific header files and library @@ -204,8 +204,6 @@ int debug; /* true if -debug */ static int shared_obj; /* true if -shared */ -static int temp_filename_length; /* Length of temp_filename */ -static char *temp_filename; /* Base of temp filenames */ static char *c_file; /* .c for constructor/destructor list. */ static char *o_file; /* .o for constructor/destructor list. */ #ifdef COLLECT_EXPORT_LIST @@ -932,7 +930,7 @@ main (argc, argv) char **object_lst = (char **) xcalloc (sizeof (char *), argc); char **object = object_lst; int first_file; - int num_c_args = argc+7; + int num_c_args = argc+8; #ifdef DEBUG debug = 1; @@ -1131,23 +1129,15 @@ main (argc, argv) *ld1++ = *ld2++ = ld_file_name; /* Make temp file names. */ - temp_filename = choose_temp_base (); - temp_filename_length = strlen (temp_filename); - c_file = xcalloc (temp_filename_length + sizeof (".c"), 1); - o_file = xcalloc (temp_filename_length + sizeof (".o"), 1); + c_file = make_temp_file (); + o_file = make_temp_file (); #ifdef COLLECT_EXPORT_LIST - export_file = xmalloc (temp_filename_length + sizeof (".x")); - import_file = xmalloc (temp_filename_length + sizeof (".p")); -#endif - ldout = xmalloc (temp_filename_length + sizeof (".ld")); - sprintf (ldout, "%s.ld", temp_filename); - sprintf (c_file, "%s.c", temp_filename); - sprintf (o_file, "%s.o", temp_filename); -#ifdef COLLECT_EXPORT_LIST - sprintf (export_file, "%s.x", temp_filename); - sprintf (import_file, "%s.p", temp_filename); + export_file = make_temp_file (); + import_file = make_temp_file (); #endif + ldout = make_temp_file (); *c_ptr++ = c_file_name; + *c_ptr++ = "-lang-c"; *c_ptr++ = "-c"; *c_ptr++ = "-o"; *c_ptr++ = o_file; @@ -1435,6 +1425,8 @@ main (argc, argv) if (import_file != 0 && import_file[0]) maybe_unlink (import_file); #endif + maybe_unlink (c_file); + maybe_unlink (o_file); return 0; } @@ -1485,6 +1477,8 @@ main (argc, argv) maybe_unlink (export_file); maybe_unlink (import_file); #endif + maybe_unlink (c_file); + maybe_unlink (o_file); return 0; } diff --git a/gcc/gcc.c b/gcc/gcc.c index cc4af8e897a..09b03326a68 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -121,7 +121,6 @@ static char dir_separator_str[] = {DIR_SEPARATOR, 0}; #define GET_ENVIRONMENT(ENV_VALUE,ENV_NAME) ENV_VALUE = getenv (ENV_NAME) #endif -extern char *choose_temp_base PROTO((void)); extern char *my_strerror PROTO((int)); #ifndef HAVE_KILL @@ -1269,6 +1268,9 @@ static int argbuf_index; #define MKTEMP_EACH_FILE #ifdef MKTEMP_EACH_FILE + +extern char *make_temp_file PROTO((void)); + /* This is the list of suffixes and codes (%g/%u/%U) and the associated temp file. */ @@ -1280,8 +1282,11 @@ static struct temp_name { int filename_length; /* strlen (filename). */ struct temp_name *next; } *temp_names; +#else +extern char *choose_temp_base PROTO((void)); #endif + /* Number of commands executed so far. */ static int execution_count; @@ -3512,7 +3517,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) t->length = p - suffix; t->suffix = save_string (suffix, p - suffix); t->unique = (c != 'g'); - temp_filename = choose_temp_base (); + temp_filename = make_temp_file (); temp_filename_length = strlen (temp_filename); t->filename = temp_filename; t->filename_length = temp_filename_length; -- 2.30.2