diff options
author | Nick Clifton <nickc@redhat.com> | 2006-10-13 09:43:29 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2006-10-13 09:43:29 +0000 |
commit | f9c026a85b129328be8ed9ce74f19fc0065454be (patch) | |
tree | 399caa063a9877ae0a03737895cb45214ca6a9d2 /binutils/bucomm.c | |
parent | ec6e49f44cf16f200634edd04c6e55ab0e2436b0 (diff) | |
download | gdb-f9c026a85b129328be8ed9ce74f19fc0065454be.zip gdb-f9c026a85b129328be8ed9ce74f19fc0065454be.tar.gz gdb-f9c026a85b129328be8ed9ce74f19fc0065454be.tar.bz2 |
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.c | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/binutils/bucomm.c b/binutils/bucomm.c index 03a4d28..7a74ea7 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. */ |