PR binutils/2876

* configure.in: Check for the mkstemp and mkdtemp functions.
* configure: Regenerate.
* config.in (HAVE_MKDTEMP): New potential define.
(MAKE_MKSTEMP): Likewise.
* bucomm.c (make_tempname): Use mkstemp if it is available.
* make_tempdir): New function: Create a temporary directory using mkdtemp, if
it is available.
* bucomm.h (make_tempdir): New prototype.
* objcopy.c (copy_archive): Use make_tempdir if it is available.
  (strip_main): Produce an warning message if a temporary file could not be
  (copy_main): Likewise.
* ar.c (write_archive): Likewise.
This commit is contained in:
Nick Clifton
2006-10-13 09:43:29 +00:00
parent ec6e49f44c
commit f9c026a85b
8 changed files with 324 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
/* bucomm.c -- Bin Utils COMmon code.
Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2003
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,12 +386,17 @@ print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose)
fprintf (file, "%s\n", bfd_get_filename (abfd));
}
/* Return the name of a temporary file in the same directory as FILENAME. */
/* Return the name of a created temporary file in the same directory as FILENAME. */
char *
make_tempname (char *filename)
{
#if defined(HAVE_MKSTEMP)
static char template[] = "stXXXXXXXXXX";
int fd;
#else
static char template[] = "stXXXXXX";
#endif
char *tmpname;
char *slash = strrchr (filename, '/');
@@ -399,6 +404,7 @@ make_tempname (char *filename)
{
/* We could have foo/bar\\baz, or foo\\bar, or d:bar. */
char *bslash = strrchr (filename, '\\');
if (slash == NULL || (bslash != NULL && bslash > slash))
slash = bslash;
if (slash == NULL && filename[0] != '\0' && filename[1] == ':')
@@ -423,17 +429,68 @@ make_tempname (char *filename)
#endif
strcat (tmpname, "/");
strcat (tmpname, template);
#if defined(HAVE_MKSTEMP)
fd = mkstemp (tmpname);
#else
mktemp (tmpname);
#endif
*slash = c;
}
else
{
tmpname = xmalloc (sizeof (template));
strcpy (tmpname, template);
mktemp (tmpname);
#if defined(HAVE_MKSTEMP)
fd = mkstemp (tmpname);
#endif
}
#if defined(HAVE_MKSTEMP)
if (fd == -1)
return NULL;
close(fd);
#endif
return tmpname;
}
#if defined(HAVE_MKDTEMP)
/* 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;
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, ".");
#endif
strcat (tmpname, "/");
strcat (tmpname, template);
mkdtemp (tmpname);
*slash = c;
}
else
{
tmpname = xmalloc (sizeof (template));
strcpy (tmpname, template);
mkdtemp (tmpname);
}
return tmpname;
}
#endif /* HAVE_MKDTEMP */
/* Parse a string into a VMA, with a fatal error if it can't be
parsed. */