From 190eb1370b7b7e8f608294d3b03d315a70761601 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Tue, 1 Mar 2005 14:33:00 +0000 Subject: [PATCH] merge from gcc --- include/ChangeLog | 4 +++ include/libiberty.h | 4 +++ libiberty/ChangeLog | 7 +++++ libiberty/Makefile.in | 9 ++++++ libiberty/unlink-if-ordinary.c | 71 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 libiberty/unlink-if-ordinary.c diff --git a/include/ChangeLog b/include/ChangeLog index 90e1d6f..d45c62a 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2005-03-01 Jan Beulich + + * libiberty.h: Declare unlink_if_ordinary. + 2005-02-21 Alan Modra * xtensa-isa-internal.h (xtensa_length_decode_fn): Warning fix. diff --git a/include/libiberty.h b/include/libiberty.h index c9f480a..4df8140 100644 --- a/include/libiberty.h +++ b/include/libiberty.h @@ -163,6 +163,10 @@ extern char *choose_temp_base PARAMS ((void)) ATTRIBUTE_MALLOC; extern char *make_temp_file PARAMS ((const char *)) ATTRIBUTE_MALLOC; +/* Remove a link to a file unless it is special. */ + +extern int unlink_if_ordinary PARAMS((const char *)); + /* Allocate memory filled with spaces. Allocates using malloc. */ extern const char *spaces PARAMS ((int count)); diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index fc8040b..6cf88d2 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,10 @@ +2005-03-01 Jan Beulich + + * Makefile.in (CFILES): Add unlink-if-ordinary.c + (REQUIRED_OFILES): Add unlink-if-ordinary.o. + Add dependencies and rule for unlink-if-ordinary.o. + * unlink-if-ordinary.c: New. + 2005-03-01 Ben Elliston * hashtab.c (htab_find_slot_with_hash): Make function diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in index ffa4ba5..3a2b20b 100644 --- a/libiberty/Makefile.in +++ b/libiberty/Makefile.in @@ -151,6 +151,7 @@ CFILES = alloca.c argv.c asprintf.c atexit.c \ strerror.c strncasecmp.c strncmp.c strrchr.c strsignal.c \ strstr.c strtod.c strtol.c strtoul.c \ ternary.c tmpnam.c \ + unlink-if-ordinary.c \ vasprintf.c vfork.c vfprintf.c vprintf.c vsnprintf.c vsprintf.c \ waitpid.c \ xatexit.c xexit.c xmalloc.c xmemdup.c xstrdup.c xstrerror.c @@ -171,6 +172,7 @@ REQUIRED_OFILES = ./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o \ ./safe-ctype.o ./sort.o ./spaces.o ./splay-tree.o ./strerror.o \ ./strsignal.o \ ./ternary.o \ + ./unlink-if-ordinary.o \ ./xatexit.o ./xexit.o ./xmalloc.o ./xmemdup.o ./xstrdup.o \ ./xstrerror.o @@ -973,6 +975,13 @@ $(CONFIGURED_OFILES): stamp-picdir else true; fi $(COMPILE.c) $(srcdir)/tmpnam.c $(OUTPUT_OPTION) +./unlink-if-ordinary.o: $(srcdir)/unlink-if-ordinary.c config.h $(INCDIR)/ansidecl.h \ + $(INCDIR)/libiberty.h + if [ x"$(PICFLAG)" != x ]; then \ + $(COMPILE.c) $(PICFLAG) $(srcdir)/unlink-if-ordinary.c -o pic/$@; \ + else true; fi + $(COMPILE.c) $(srcdir)/unlink-if-ordinary.c $(OUTPUT_OPTION) + ./vasprintf.o: $(srcdir)/vasprintf.c config.h $(INCDIR)/ansidecl.h \ $(INCDIR)/libiberty.h if [ x"$(PICFLAG)" != x ]; then \ diff --git a/libiberty/unlink-if-ordinary.c b/libiberty/unlink-if-ordinary.c new file mode 100644 index 0000000..297b14b --- /dev/null +++ b/libiberty/unlink-if-ordinary.c @@ -0,0 +1,71 @@ +/* unlink-if-ordinary.c - remove link to a file unless it is special + Copyright (C) 2004 Free Software Foundation, Inc. + +This file is part of the libiberty library. This library is free +software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) +any later version. + +This library 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +/* + +@deftypefn Supplemental int unlink_if_ordinary (const char*) + +Unlinks the named file, unless it is special (e.g. a device file). +Returns 0 when the file was unlinked, a negative value (and errno set) when +there was an error deleting the file, and a positive value if no attempt +was made to unlink the file because it is special. + +@end deftypefn + +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif +#if HAVE_SYS_STAT_H +#include +#endif + +#include "libiberty.h" + +#ifndef S_ISLNK +#ifdef S_IFLNK +#define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#else +#define S_ISLNK(m) 0 +#define lstat stat +#endif +#endif + +int +unlink_if_ordinary (name) + const char *name; +{ + struct stat st; + + if (lstat (name, &st) == 0 + && (S_ISREG (st.st_mode) || S_ISLNK (st.st_mode))) + return unlink (name); + + return 1; +} -- 2.7.4