binutils-gdb/libiberty/make-temp-file.c

217 lines
5.5 KiB
C
Raw Normal View History

2001-03-21 21:12:30 +01:00
/* Utility to pick a temporary filename prefix.
Update the libiberty sources with the latest patches found in the master sources. 2017-01-02 Richard Biener <rguenther@suse.de> PR lto/83452 * simple-object-elf.c (simple_object_elf_copy_lto_debug_section): Do not use UNDEF locals for removed symbols but instead just define them in the first prevailing section and with no name. Use the same gnu_lto_v1 name for all removed globals we promote to WEAK UNDEFs so hpux can use a stub to provide this symbol. Clear sh_info and sh_link in removed sections. 2017-10-30 Richard Biener <rguenther@suse.de> PR lto/82757 * simple-object-elf.c (simple_object_elf_copy_lto_debug_sections): Strip two leading _s from the __gnu_lto_* symbols. 2017-10-24 Alan Modra <amodra@gmail.com> PR lto/82687 PR lto/82575 * simple-object-elf.c (simple_object_elf_copy_lto_debug_sections): Only make __gnu_lto symbols hidden. 2017-10-20 Alan Modra <amodra@gmail.com> PR lto/82575 * simple-object-elf.c (simple_object_elf_copy_lto_debug_sections): Make discarded non-local symbols weak and hidden. 2017-10-18 Jakub Jelinek <jakub@redhat.com> PR lto/82598 * simple-object.c (handle_lto_debug_sections): Copy over also .note.GNU-stack section with unchanged name. * simple-object-elf.c (SHF_EXECINSTR): Define. (simple_object_elf_copy_lto_debug_section): Drop SHF_EXECINSTR bit on .note.GNU-stack section. 2017-09-25 Nathan Sidwell <nathan@acm.org> PR demangler/82195 * cp-demangle.c (d_encoding): Strip return type when name is a LOCAL_NAME. (d_local_name): Strip return type of enclosing TYPED_NAME. * testsuite/demangle-expected: Add and adjust tests. 2017-09-21 Nathan Sidwell <nathan@acm.org> PR demangler/82195 * cp-demangle.c (d_name): Revert addition of 'toplevel' parm. (has_return_type): Recurse for DEMANGLE_COMPONENT_LOCAL_NAME. (d_encoding): Revert d_name change. Use is_fnqual_component_type to strip modifiers that do not belong. (d_special_name, d_class_enum_type): Revert d_name call change. (d_expresion_1): Commonize DEMANGLE_COMPONENT_UNARY building. (d_local_name): Revert parsing of a function type. (d_print_comp_inner): An inner LOCAL_NAME might contain a TEMPLATE. * testsuite/demangle-expected: Add & adjust tests
2018-01-10 14:57:48 +01:00
Copyright (C) 1996-2018 Free Software Foundation, Inc.
2001-03-21 21:12:30 +01:00
This file is part of the libiberty library.
Libiberty is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
Libiberty is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with libiberty; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
Boston, MA 02110-1301, USA. */
2001-03-21 21:12:30 +01:00
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h> /* May get P_tmpdir. */
#include <sys/types.h>
2008-07-31 21:06:35 +02:00
#include <errno.h>
2001-03-21 21:12:30 +01:00
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_STRING_H
#include <string.h>
#endif
#ifdef HAVE_SYS_FILE_H
#include <sys/file.h> /* May get R_OK, etc. on some systems. */
#endif
2009-02-23 01:16:38 +01:00
#if defined(_WIN32) && !defined(__CYGWIN__)
#include <windows.h>
#endif
2001-03-21 21:12:30 +01:00
#ifndef R_OK
#define R_OK 4
#define W_OK 2
#define X_OK 1
#endif
#include "libiberty.h"
2005-03-28 04:09:01 +02:00
extern int mkstemps (char *, int);
2001-03-21 21:12:30 +01:00
/* '/' works just fine on MS-DOS based systems. */
#ifndef DIR_SEPARATOR
#define DIR_SEPARATOR '/'
#endif
/* Name of temporary file.
mktemp requires 6 trailing X's. */
#define TEMP_FILE "ccXXXXXX"
#define TEMP_FILE_LEN (sizeof(TEMP_FILE) - 1)
2009-02-23 01:16:38 +01:00
#if !defined(_WIN32) || defined(__CYGWIN__)
2001-03-21 21:12:30 +01:00
/* Subroutine of choose_tmpdir.
If BASE is non-NULL, return it.
Otherwise it checks if DIR is a usable directory.
If success, DIR is returned.
Otherwise NULL is returned. */
2005-05-24 23:01:33 +02:00
static inline const char *try_dir (const char *, const char *);
2001-03-21 21:12:30 +01:00
2001-04-04 03:16:27 +02:00
static inline const char *
2005-05-24 23:01:33 +02:00
try_dir (const char *dir, const char *base)
2001-03-21 21:12:30 +01:00
{
if (base != 0)
return base;
if (dir != 0
&& access (dir, R_OK | W_OK | X_OK) == 0)
return dir;
return 0;
}
static const char tmp[] = { DIR_SEPARATOR, 't', 'm', 'p', 0 };
static const char usrtmp[] =
{ DIR_SEPARATOR, 'u', 's', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
static const char vartmp[] =
{ DIR_SEPARATOR, 'v', 'a', 'r', DIR_SEPARATOR, 't', 'm', 'p', 0 };
2009-02-23 01:16:38 +01:00
#endif
2001-03-21 21:12:30 +01:00
static char *memoized_tmpdir;
2001-10-16 04:55:31 +02:00
/*
2014-11-17 03:30:13 +01:00
@deftypefn Replacement const char* choose_tmpdir ()
2001-10-16 04:55:31 +02:00
Returns a pointer to a directory path suitable for creating temporary
files in.
@end deftypefn
*/
2014-11-17 03:30:13 +01:00
const char *
2005-03-28 04:09:01 +02:00
choose_tmpdir (void)
2001-03-21 21:12:30 +01:00
{
2009-02-23 01:16:38 +01:00
if (!memoized_tmpdir)
{
#if !defined(_WIN32) || defined(__CYGWIN__)
const char *base = 0;
char *tmpdir;
unsigned int len;
2009-07-29 22:01:28 +02:00
#ifdef VMS
/* Try VMS standard temp logical. */
base = try_dir ("/sys$scratch", base);
#else
2009-02-23 01:16:38 +01:00
base = try_dir (getenv ("TMPDIR"), base);
base = try_dir (getenv ("TMP"), base);
base = try_dir (getenv ("TEMP"), base);
2009-07-29 22:01:28 +02:00
#endif
2009-02-23 01:16:38 +01:00
2001-03-21 21:12:30 +01:00
#ifdef P_tmpdir
2010-07-21 18:08:01 +02:00
/* We really want a directory name here as if concatenated with say \dir
we do not end up with a double \\ which defines an UNC path. */
if (strcmp (P_tmpdir, "\\") == 0)
base = try_dir ("\\.", base);
else
base = try_dir (P_tmpdir, base);
2001-03-21 21:12:30 +01:00
#endif
2009-02-23 01:16:38 +01:00
/* Try /var/tmp, /usr/tmp, then /tmp. */
base = try_dir (vartmp, base);
base = try_dir (usrtmp, base);
base = try_dir (tmp, base);
/* If all else fails, use the current directory! */
if (base == 0)
base = ".";
/* Append DIR_SEPARATOR to the directory we've chosen
and return it. */
len = strlen (base);
tmpdir = XNEWVEC (char, len + 2);
strcpy (tmpdir, base);
tmpdir[len] = DIR_SEPARATOR;
tmpdir[len+1] = '\0';
memoized_tmpdir = tmpdir;
#else /* defined(_WIN32) && !defined(__CYGWIN__) */
DWORD len;
/* Figure out how much space we need. */
len = GetTempPath(0, NULL);
if (len)
{
memoized_tmpdir = XNEWVEC (char, len);
if (!GetTempPath(len, memoized_tmpdir))
{
XDELETEVEC (memoized_tmpdir);
memoized_tmpdir = NULL;
}
}
if (!memoized_tmpdir)
/* If all else fails, use the current directory. */
memoized_tmpdir = xstrdup (".\\");
#endif /* defined(_WIN32) && !defined(__CYGWIN__) */
}
return memoized_tmpdir;
2001-03-21 21:12:30 +01:00
}
2001-10-16 04:55:31 +02:00
/*
@deftypefn Replacement char* make_temp_file (const char *@var{suffix})
Return a temporary file name (as a string) or @code{NULL} if unable to
create one. @var{suffix} is a suffix to append to the file name. The
2001-10-18 00:35:28 +02:00
string is @code{malloc}ed, and the temporary file has been created.
2001-10-16 04:55:31 +02:00
@end deftypefn
*/
2001-03-21 21:12:30 +01:00
char *
2005-03-28 04:09:01 +02:00
make_temp_file (const char *suffix)
2001-03-21 21:12:30 +01:00
{
const char *base = choose_tmpdir ();
char *temp_filename;
int base_len, suffix_len;
int fd;
if (suffix == 0)
suffix = "";
base_len = strlen (base);
suffix_len = strlen (suffix);
2005-05-24 23:01:33 +02:00
temp_filename = XNEWVEC (char, base_len
2001-03-21 21:12:30 +01:00
+ TEMP_FILE_LEN
+ suffix_len + 1);
strcpy (temp_filename, base);
strcpy (temp_filename + base_len, TEMP_FILE);
strcpy (temp_filename + base_len + TEMP_FILE_LEN, suffix);
fd = mkstemps (temp_filename, suffix_len);
2008-07-31 21:06:35 +02:00
/* Mkstemps failed. It may be EPERM, ENOSPC etc. */
2001-03-21 21:12:30 +01:00
if (fd == -1)
2008-07-31 21:06:35 +02:00
{
fprintf (stderr, "Cannot create temporary file in %s: %s\n",
base, strerror (errno));
abort ();
}
/* We abort on failed close out of sheer paranoia. */
2001-03-21 21:12:30 +01:00
if (close (fd))
abort ();
return temp_filename;
}