diff options
author | Alan Modra <amodra@gmail.com> | 2007-01-10 13:36:34 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2007-01-10 13:36:34 +0000 |
commit | 485be063485746449d56642a4ed73b18dce247a4 (patch) | |
tree | 3e922ec22ce525f7fecd4ad59b67c93b640690bf /binutils/bucomm.c | |
parent | 20ac0504943144239f1cabbed69573dc6b97c99c (diff) | |
download | gdb-485be063485746449d56642a4ed73b18dce247a4.zip gdb-485be063485746449d56642a4ed73b18dce247a4.tar.gz gdb-485be063485746449d56642a4ed73b18dce247a4.tar.bz2 |
* 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.
Diffstat (limited to 'binutils/bucomm.c')
-rw-r--r-- | binutils/bucomm.c | 124 |
1 files changed, 58 insertions, 66 deletions
diff --git a/binutils/bucomm.c b/binutils/bucomm.c index 7a74ea7..cfc7d4e 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) - if (fd == -1) + + 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; - close(fd); + fd = open (tmpname, O_RDWR | O_CREAT | O_EXCL, 0600); #endif + if (fd == -1) + return NULL; + 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, '/'); - - if (slash != (char *) NULL) - { - char c; + char *tmpname = template_in_dir (filename); - 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. */ |