diff --git a/binutils/ChangeLog b/binutils/ChangeLog index be0122b50c..f5d49e452b 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,14 @@ +2007-01-11 Alan Modra + + * 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 * readelf.c (get_machine_flags): Treat Fido as an architecture diff --git a/binutils/bucomm.c b/binutils/bucomm.c index 7a74ea740a..cfc7d4e4e2 100644 --- a/binutils/bucomm.c +++ b/binutils/bucomm.c @@ -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) + + 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; + fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600); +#endif if (fd == -1) return NULL; - close(fd); -#endif + 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, '/'); + char *tmpname = template_in_dir (filename); - if (slash != (char *) NULL) - { - char c; - - 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. */ diff --git a/binutils/bucomm.h b/binutils/bucomm.h index 99dbcfca00..c46932d270 100644 --- a/binutils/bucomm.h +++ b/binutils/bucomm.h @@ -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 *); diff --git a/binutils/objcopy.c b/binutils/objcopy.c index 0b2badab5f..70238dace3 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -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;