* bucomm.h (make_tempdir): Declare independently of HAVE_MKDTEMP.
authorAlan Modra <amodra@gmail.com>
Wed, 10 Jan 2007 13:36:34 +0000 (13:36 +0000)
committerAlan Modra <amodra@gmail.com>
Wed, 10 Jan 2007 13:36:34 +0000 (13:36 +0000)
* bucomm.c (template_in_dir): New function, split out from..
(make_tempname): ..here.  Open the file with O_EXCL if !HAVE_MKSTEMP.
(make_tempdir): Use template_in_dir.  Handle directory creation
when !HAVE_MKDTEMP.
* objcopy.c (MKDIR): Don't define.
(copy_archive): Use make_tempdir when !HAVE_MKDTEMP too.  Fix
error message.

binutils/ChangeLog
binutils/bucomm.c
binutils/bucomm.h
binutils/objcopy.c

index be0122b50c4679eb90c814542411fd0ba7c38269..f5d49e452b49563716731cff7df9cacce52a1dff 100644 (file)
@@ -1,3 +1,14 @@
+2007-01-11  Alan Modra  <amodra@bigpond.net.au>
+
+       * bucomm.h (make_tempdir): Declare independently of HAVE_MKDTEMP.
+       * bucomm.c (template_in_dir): New function, split out from..
+       (make_tempname): ..here.  Open the file with O_EXCL if !HAVE_MKSTEMP.
+       (make_tempdir): Use template_in_dir.  Handle directory creation
+       when !HAVE_MKDTEMP.
+       * objcopy.c (MKDIR): Don't define.
+       (copy_archive): Use make_tempdir when !HAVE_MKDTEMP too.  Fix
+       error message.
+
 2007-01-08  Kazu Hirata  <kazu@codesourcery.com>
 
        * readelf.c (get_machine_flags): Treat Fido as an architecture
index 7a74ea740aeb655b353d66d95bbe5b2ab9ac576b..cfc7d4e4e2991b4518e455a88fb578ac59ca6384 100644 (file)
@@ -1,5 +1,6 @@
 /* bucomm.c -- Bin Utils COMmon code.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2003, 2006
+   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
+   2003, 2006
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -386,111 +387,102 @@ print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose)
   fprintf (file, "%s\n", bfd_get_filename (abfd));
 }
 
-/* Return the name of a created temporary file in the same directory as FILENAME.  */
+/* Return a path for a new temporary file in the same directory
+   as file PATH.  */
 
-char *
-make_tempname (char *filename)
+static char *
+template_in_dir (const char *path)
 {
-#if defined(HAVE_MKSTEMP)
-  static char template[] = "stXXXXXXXXXX";
-  int fd;
-#else
-  static char template[] = "stXXXXXX";
-#endif
+#define template "stXXXXXX"
+  char *slash = strrchr (path, '/');
   char *tmpname;
-  char *slash = strrchr (filename, '/');
+  size_t len;
 
 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
   {
     /* We could have foo/bar\\baz, or foo\\bar, or d:bar.  */
-    char *bslash = strrchr (filename, '\\');
+    char *bslash = strrchr (path, '\\');
 
     if (slash == NULL || (bslash != NULL && bslash > slash))
       slash = bslash;
-    if (slash == NULL && filename[0] != '\0' && filename[1] == ':')
+    if (slash == NULL && path[0] != '\0' && path[1] == ':')
       slash = filename + 1;
   }
 #endif
 
   if (slash != (char *) NULL)
     {
-      char c;
+      len = slash - path;
+      tmpname = xmalloc (len + sizeof (template) + 2);
+      memcpy (tmpname, path, len);
 
-      c = *slash;
-      *slash = 0;
-      tmpname = xmalloc (strlen (filename) + sizeof (template) + 2);
-      strcpy (tmpname, filename);
 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
       /* If tmpname is "X:", appending a slash will make it a root
         directory on drive X, which is NOT the same as the current
         directory on drive X.  */
-      if (tmpname[1] == ':' && tmpname[2] == '\0')
-       strcat (tmpname, ".");
+      if (len == 2 && tmpname[1] == ':')
+       tmpname[len++] = '.';
 #endif
-      strcat (tmpname, "/");
-      strcat (tmpname, template);
-#if defined(HAVE_MKSTEMP)
-      fd = mkstemp (tmpname);
-#else
-      mktemp (tmpname);
-#endif
-      *slash = c;
+      tmpname[len++] = '/';
     }
   else
     {
       tmpname = xmalloc (sizeof (template));
-      strcpy (tmpname, template);
-#if defined(HAVE_MKSTEMP)
-      fd = mkstemp (tmpname);
-#endif
+      len = 0;
     }
-#if defined(HAVE_MKSTEMP)
-  if (fd == -1)
+
+  memcpy (tmpname + len, template, sizeof (template));
+  return tmpname;
+#undef template
+}
+
+/* Return the name of a created temporary file in the same directory
+   as FILENAME.  */
+
+char *
+make_tempname (char *filename)
+{
+  char *tmpname = template_in_dir (filename);
+  int fd;
+
+#ifdef HAVE_MKSTEMP
+  fd = mkstemp (tmpname);
+#else
+  tmpname = mktemp (tmpname);
+  if (tmpname == NULL)
     return NULL;
-  close(fd);
+  fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600);
 #endif
+  if (fd == -1)
+    return NULL;
+  close (fd);
   return tmpname;
 }
 
-#if defined(HAVE_MKDTEMP)
-/* Return the name of a created temporary directory inside the directory containing FILENAME.  */
+/* Return the name of a created temporary directory inside the
+   directory containing FILENAME.  */
 
 char *
 make_tempdir (char *filename)
 {
-  static char template[] = "stXXXXXXXXXX";
-  char *tmpname;
-  char *slash = strrchr (filename, '/');
-
-  if (slash != (char *) NULL)
-    {
-      char c;
+  char *tmpname = template_in_dir (filename);
 
-      c = *slash;
-      *slash = 0;
-      tmpname = xmalloc (strlen (filename) + sizeof (template) + 1);
-      strcpy (tmpname, filename);
-#ifdef HAVE_DOS_BASED_FILE_SYSTEM
-      /* If tmpname is "X:", appending a slash will make it a root
-         directory on drive X, which is NOT the same as the current
-         directory on drive X.  */
-      if (tmpname[1] == ':' && tmpname[2] == '\0')
-        strcat (tmpname, ".");
+#ifdef HAVE_MKDTEMP
+  return mkdtemp (tmpname);
+#else
+  tmpname = mktemp (tmpname);
+  if (tmpname == NULL)
+    return NULL;
+#if defined (_WIN32) && !defined (__CYGWIN32__)
+  if (mkdir (tmpname) != 0)
+    return NULL;
+#else
+  if (mkdir (tmpname, 0700) != 0)
+    return NULL;
 #endif
-      strcat (tmpname, "/");
-      strcat (tmpname, template);
-      mkdtemp (tmpname);
-      *slash = c;
-   }
-  else
-    {
-      tmpname = xmalloc (sizeof (template));
-      strcpy (tmpname, template);
-      mkdtemp (tmpname);
-    }
   return tmpname;
+#endif
 }
-#endif /* HAVE_MKDTEMP */
 
 /* Parse a string into a VMA, with a fatal error if it can't be
    parsed.  */
index 99dbcfca0024db9e569cb863239536f13fc28577..c46932d2707ef9edd8700d73f8e28b3fcde403a6 100644 (file)
@@ -200,9 +200,7 @@ int display_info (void);
 void print_arelt_descr (FILE *, bfd *, bfd_boolean);
 
 char *make_tempname (char *);
-#if defined(HAVE_MKDTEMP)
 char *make_tempdir (char *);
-#endif
 
 bfd_vma parse_vma (const char *, const char *);
 
index 0b2badab5fa22114fcd8112943669e206b3e8550..70238dace33cdf02a39c768818c407ac23f4eec5 100644 (file)
@@ -1764,15 +1764,6 @@ copy_object (bfd *ibfd, bfd *obfd)
   return TRUE;
 }
 
-#if ! defined(HAVE_MKDTEMP)
-#undef MKDIR
-#if defined (_WIN32) && !defined (__CYGWIN32__)
-#define MKDIR(DIR, MODE) mkdir (DIR)
-#else
-#define MKDIR(DIR, MODE) mkdir (DIR, MODE)
-#endif
-#endif
-
 /* Read each archive element in turn from IBFD, copy the
    contents to temp file, and keep the temp file handle.
    If 'force_output_target' is TRUE then make sure that
@@ -1794,19 +1785,10 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
   char * dir;
 
   /* Make a temp directory to hold the contents.  */
-#if defined(HAVE_MKDTEMP)
   dir = make_tempdir (bfd_get_filename (obfd));
-
   if (dir == NULL)
       fatal (_("cannot create tempdir for archive copying (error: %s)"),
           strerror (errno));
-#else
-  dir = make_tempname (bfd_get_filename (obfd));
-
-  if (MKDIR (dir, 0700) != 0)
-    fatal (_("cannot mkdir %s for archive copying (error: %s)"),
-          dir, strerror (errno));
-#endif
 
   obfd->has_armap = ibfd->has_armap;
 
@@ -1833,17 +1815,10 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
       /* If the file already exists, make another temp dir.  */
       if (stat (output_name, &buf) >= 0)
        {
-#if defined(HAVE_MKDTEMP)
          output_name = make_tempdir (output_name);
          if (output_name == NULL)
-           fatal (_("cannot create temporary dir '%s' for archive copying (error: %s)"),
-                  output_name, strerror (errno));
-#else
-         output_name = make_tempname (output_name);
-         if (MKDIR (output_name, 0700) != 0)
-           fatal (_("cannot mkdir %s for archive copying (error: %s)"),
-                  output_name, strerror (errno));
-#endif
+           fatal (_("cannot create tempdir for archive copying (error: %s)"),
+                  strerror (errno));
 
          l = xmalloc (sizeof (struct name_list));
          l->name = output_name;