merge from gcc
authorDJ Delorie <dj@redhat.com>
Tue, 1 Mar 2005 14:33:00 +0000 (14:33 +0000)
committerDJ Delorie <dj@redhat.com>
Tue, 1 Mar 2005 14:33:00 +0000 (14:33 +0000)
include/ChangeLog
include/libiberty.h
libiberty/ChangeLog
libiberty/Makefile.in
libiberty/unlink-if-ordinary.c [new file with mode: 0644]

index 90e1d6f1f22494527fe85adf45a6538eaa8a7aa9..d45c62a3ca4e12f04ae89c7710eae95fbf3df92e 100644 (file)
@@ -1,3 +1,7 @@
+2005-03-01  Jan Beulich  <jbeulich@novell.com>
+
+       * libiberty.h: Declare unlink_if_ordinary.
+
 2005-02-21  Alan Modra  <amodra@bigpond.net.au>
 
        * xtensa-isa-internal.h (xtensa_length_decode_fn): Warning fix.
index c9f480aaf6955def94cbe97fe625a06cbbfe6d76..4df814092c539aba67b2bd731fcff272c07c808d 100644 (file)
@@ -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));
index fc8040bc1cca1d6769ec960832bcf0b325a8e351..6cf88d2ebdd359b2334c51a9c1dcbc99002a9606 100644 (file)
@@ -1,3 +1,10 @@
+2005-03-01  Jan Beulich  <jbeulich@novell.com>
+
+       * 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  <bje@au.ibm.com>
 
        * hashtab.c (htab_find_slot_with_hash): Make function
index ffa4ba51d67c9148737e99d405fbbae38e957d30..3a2b20bff3beff5ec505d8c7a259566cb34a6c5f 100644 (file)
@@ -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 (file)
index 0000000..297b14b
--- /dev/null
@@ -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 <unistd.h>
+#endif
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#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;
+}