* 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.
This commit is contained in:
Alan Modra 2007-01-10 13:36:34 +00:00
parent 20ac050494
commit 485be06348
4 changed files with 71 additions and 95 deletions

View 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

View 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)
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. */

View 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 *);

View 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;