merge from gcc
authorDJ Delorie <dj@redhat.com>
Wed, 21 Mar 2001 20:12:30 +0000 (20:12 +0000)
committerDJ Delorie <dj@redhat.com>
Wed, 21 Mar 2001 20:12:30 +0000 (20:12 +0000)
libiberty/ChangeLog
libiberty/Makefile.in
libiberty/choose-temp.c
libiberty/make-temp-file.c [new file with mode: 0644]

index 628a155ddf06e5803b681d5fbc89ca819196a191..7bc9eb11a35fff33e0be784f5d998ff6c58909db 100644 (file)
@@ -1,3 +1,18 @@
+2001-03-21  Zack Weinberg  <zackw@stanford.edu>
+
+       * make-temp-file.c: Always default DIR_SEPARATOR to '/'.
+       Don't default P_tmpdir to anything.  Try /var/tmp before
+       /usr/tmp.
+
+2001-03-20  Zack Weinberg  <zackw@stanford.edu>
+
+       * choose-temp.c: Split off make_temp_file, and the code
+       duplicated between it and choose_temp_base, into...
+       * make-temp-file.c: ... here; new file.
+
+       * Makefile.in (CFILES): Add make-temp-file.c.
+       (REQUIRED_OFILES): Add make-temp-file.o.
+
 2001-03-20  Jim Blandy  <jimb@redhat.com>
 
        * cp-demangle.c (struct demangling_def): New fields:
index d0202188b392991ee06f2c2b9073b3180c9d1c84..2b95074b5e799fad68ef59cd6a6f0f6d2e36acbf 100644 (file)
@@ -125,7 +125,7 @@ CFILES = asprintf.c alloca.c argv.c atexit.c basename.c bcmp.c bcopy.c            \
         cp-demangle.c dyn-string.c fdmatch.c fnmatch.c getcwd.c                      \
        getpwd.c getopt.c getopt1.c getpagesize.c getruntime.c                \
        floatformat.c hashtab.c hex.c index.c insque.c lbasename.c            \
-       md5.c memchr.c                                                        \
+       md5.c make-temp-file.c memchr.c                                       \
        memcmp.c memcpy.c memmove.c memset.c mkstemps.c objalloc.c obstack.c  \
        partition.c pexecute.c putenv.c random.c rename.c rindex.c setenv.c   \
        sigsetmask.c safe-ctype.c sort.c spaces.c splay-tree.c strcasecmp.c   \
@@ -138,7 +138,7 @@ CFILES = asprintf.c alloca.c argv.c atexit.c basename.c bcmp.c bcopy.c            \
 REQUIRED_OFILES = argv.o alloca.o choose-temp.o concat.o cplus-dem.o          \
        cp-demangle.o dyn-string.o fdmatch.o fnmatch.o getopt.o getopt1.o     \
        getpwd.o getruntime.o hashtab.o hex.o floatformat.o lbasename.o       \
-        md5.o objalloc.o                                                     \
+        md5.o make-temp-file.o objalloc.o                                    \
        obstack.o partition.o pexecute.o safe-ctype.o sort.o spaces.o         \
        splay-tree.o strerror.o strsignal.o xatexit.o xexit.o xmalloc.o       \
        xmemdup.o xstrdup.o xstrerror.o
index 1a475dd6fb93b91cd2cb2d26416a7d779cec13ac..c6df304b5528bc239fe83a9a0c1738c0d50a2e2b 100644 (file)
@@ -17,81 +17,25 @@ 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 two functions: choose_temp_base and make_temp_file.  */
-
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 
 #include <stdio.h>     /* May get P_tmpdir.  */
-#include <sys/types.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
 #ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
 #ifdef HAVE_STRING_H
 #include <string.h>
 #endif
-#ifdef HAVE_SYS_FILE_H
-#include <sys/file.h>   /* May get R_OK, etc. on some systems.  */
-#endif
-
-#ifndef R_OK
-#define R_OK 4
-#define W_OK 2
-#define X_OK 1
-#endif
 
 #include "libiberty.h"
-extern int mkstemps ();
-
-#ifndef IN_GCC
-#if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN__) && ! defined (_UWIN))
-#define DIR_SEPARATOR '\\'
-#endif
-#endif
-
-#ifndef DIR_SEPARATOR
-#define DIR_SEPARATOR '/'
-#endif
-
-/* On MSDOS, write temp files in current dir
-   because there's no place else we can expect to use.  */
-/* ??? Although the current directory is tried as a last resort,
-   this is left in so that on MSDOS it is preferred to /tmp on the
-   off chance that someone requires this, since that was the previous
-   behaviour.  */
-#ifdef __MSDOS__
-#ifndef P_tmpdir
-#define P_tmpdir "."
-#endif
-#endif
+extern char *choose_tmpdir PARAMS ((void));
 
 /* Name of temporary file.
    mktemp requires 6 trailing X's.  */
 #define TEMP_FILE "ccXXXXXX"
-
-/* Subroutine of choose_temp_base.
-   If BASE is non-NULL, return it.
-   Otherwise it checks if DIR is a usable directory.
-   If success, DIR is returned.
-   Otherwise NULL is returned.  */
-
-static const char *try PARAMS ((const char *, const char *));
-
-static const char *
-try (dir, base)
-     const char *dir, *base;
-{
-  if (base != 0)
-    return base;
-  if (dir != 0
-      && access (dir, R_OK | W_OK | X_OK) == 0)
-    return dir;
-  return 0;
-}
+#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
 
 /* 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
@@ -104,37 +48,13 @@ try (dir, base)
 char *
 choose_temp_base ()
 {
-  const char *base = 0;
+  const char *base = choose_tmpdir ();
   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);
+  temp_filename = xmalloc (len + TEMP_FILE_LEN + 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);
@@ -142,64 +62,3 @@ choose_temp_base ()
     abort ();
   return temp_filename;
 }
-/* Return a temporary file name (as a string) or NULL if unable to create
-   one.  */
-
-char *
-make_temp_file (suffix)
-     const char *suffix;
-{
-  const char *base = 0;
-  char *temp_filename;
-  int base_len, suffix_len;
-  int fd;
-  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 = ".";
-
-  base_len = strlen (base);
-
-  if (suffix)
-    suffix_len = strlen (suffix);
-  else
-    suffix_len = 0;
-
-  temp_filename = xmalloc (base_len + 1 /*DIR_SEPARATOR*/
-                          + strlen (TEMP_FILE)
-                          + suffix_len + 1);
-  strcpy (temp_filename, base);
-
-  if (base_len != 0
-      && temp_filename[base_len-1] != '/'
-      && temp_filename[base_len-1] != DIR_SEPARATOR)
-    temp_filename[base_len++] = DIR_SEPARATOR;
-  strcpy (temp_filename + base_len, TEMP_FILE);
-
-  if (suffix)
-    strcat (temp_filename, suffix);
-
-  fd = mkstemps (temp_filename, suffix_len);
-  /* If mkstemps failed, then something bad is happening.  Maybe we should
-     issue a message about a possible security attack in progress?  */
-  if (fd == -1)
-    abort ();
-  /* Similarly if we can not close the file.  */
-  if (close (fd))
-    abort ();
-  return temp_filename;
-}
diff --git a/libiberty/make-temp-file.c b/libiberty/make-temp-file.c
new file mode 100644 (file)
index 0000000..67efed1
--- /dev/null
@@ -0,0 +1,160 @@
+/* Utility to pick a temporary filename prefix.
+   Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+
+This file is part of the libiberty library.
+Libiberty is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+Libiberty is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+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.  */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>     /* May get P_tmpdir.  */
+#include <sys/types.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+#ifdef HAVE_SYS_FILE_H
+#include <sys/file.h>   /* May get R_OK, etc. on some systems.  */
+#endif
+
+#ifndef R_OK
+#define R_OK 4
+#define W_OK 2
+#define X_OK 1
+#endif
+
+#include "libiberty.h"
+extern int mkstemps PARAMS ((char *, int));
+
+/* '/' works just fine on MS-DOS based systems.  */
+#ifndef DIR_SEPARATOR
+#define DIR_SEPARATOR '/'
+#endif
+
+/* Name of temporary file.
+   mktemp requires 6 trailing X's.  */
+#define TEMP_FILE "ccXXXXXX"
+#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
+
+/* Subroutine of choose_tmpdir.
+   If BASE is non-NULL, return it.
+   Otherwise it checks if DIR is a usable directory.
+   If success, DIR is returned.
+   Otherwise NULL is returned.  */
+
+static const char *try PARAMS ((const char *, const char *));
+
+static const char *
+try (dir, base)
+     const char *dir, *base;
+{
+  if (base != 0)
+    return base;
+  if (dir != 0
+      && access (dir, R_OK | W_OK | X_OK) == 0)
+    return dir;
+  return 0;
+}
+
+static const char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 };
+static const char usrtmp[] =
+{ DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
+static const char vartmp[] =
+{ DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
+
+static char *memoized_tmpdir;
+
+char *
+choose_tmpdir ()
+{
+  const char *base = 0;
+  char *tmpdir;
+  unsigned int len;
+
+  if (memoized_tmpdir)
+    return memoized_tmpdir;
+
+  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 /var/tmp, /usr/tmp, then /tmp.  */
+  base = try (vartmp, base);
+  base = try (usrtmp, base);
+  base = try (tmp, base);
+  /* If all else fails, use the current directory!  */
+  if (base == 0)
+    base = ".";
+
+  /* Append DIR_SEPARATOR to the directory we've chosen
+     and return it.  */
+  len = strlen (base);
+  tmpdir = xmalloc (len + 2);
+  strcpy (tmpdir, base);
+  tmpdir[len] = DIR_SEPARATOR;
+  tmpdir[len+1] = '\0';
+
+  memoized_tmpdir = tmpdir;
+  return tmpdir;
+}
+
+/* Return a temporary file name (as a string) or NULL if unable to create
+   one.  SUFFIX is a suffix to append to the file name.  The string is
+   malloced, and the temporary file has been created.  */
+
+char *
+make_temp_file (suffix)
+     const char *suffix;
+{
+  const char *base = choose_tmpdir ();
+  char *temp_filename;
+  int base_len, suffix_len;
+  int fd;
+
+  if (suffix == 0)
+    suffix = "";
+
+  base_len = strlen (base);
+  suffix_len = strlen (suffix);
+
+  temp_filename = xmalloc (base_len
+                          + TEMP_FILE_LEN
+                          + suffix_len + 1);
+  strcpy (temp_filename, base);
+  strcpy (temp_filename + base_len, TEMP_FILE);
+  strcpy (temp_filename + base_len + TEMP_FILE_LEN, suffix);
+
+  fd = mkstemps (temp_filename, suffix_len);
+  /* If mkstemps failed, then something bad is happening.  Maybe we should
+     issue a message about a possible security attack in progress?  */
+  if (fd == -1)
+    abort ();
+  /* Similarly if we can not close the file.  */
+  if (close (fd))
+    abort ();
+  return temp_filename;
+}