summaryrefslogtreecommitdiff
path: root/binutils/bucomm.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2006-10-13 09:43:29 +0000
committerNick Clifton <nickc@redhat.com>2006-10-13 09:43:29 +0000
commit94a6b686fbcc95474c21d88095b2adc5e70d676c (patch)
tree904524cfb86422835af24309e48bf8e35bf91889 /binutils/bucomm.c
parentd355761bd4f5b31c71af0b3a360d52e0982f0062 (diff)
downloadbinutils-redhat-94a6b686fbcc95474c21d88095b2adc5e70d676c.tar.gz
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.
Diffstat (limited to 'binutils/bucomm.c')
-rw-r--r--binutils/bucomm.c63
1 files changed, 60 insertions, 3 deletions
diff --git a/binutils/bucomm.c b/binutils/bucomm.c
index 03a4d2873e..7a74ea740a 100644
--- a/binutils/bucomm.c
+++ b/binutils/bucomm.c
@@ -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. */