>>> DJ Delorie 25.01.05 14:53:06 >>> > >> Was this fixed meanwhile? That is, can I adjust/resubmit the patch so I >> can then finally apply the binutils one utilizing this functionality? > >Oh, right. Yes, it was. Please retest your patch and resubmit it >against the latest sources. > >I'll ask whether or not it's OK to add before gcc branches. No changes turned out necessary over the originally submitted version. Nevertheless, re-built and re-tested in binutils mainline (where it is needed) on i686-pc-linux-gnu. Jan include/ 2005-01-26 Jan Beulich * libiberty.h: Declare unlink_if_ordinary. libiberty/ 2005-01-26 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. --- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/include/libiberty.h 2004-10-06 09:35:58.000000000 +0200 +++ 2005-01-25.13.54/include/libiberty.h 2005-01-26 08:30:25.237909080 +0100 @@ -163,6 +163,10 @@ extern char *choose_temp_base PARAMS ((v 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)); --- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/libiberty/Makefile.in 2005-01-18 10:44:24.000000000 +0100 +++ 2005-01-25.13.54/libiberty/Makefile.in 2005-01-26 08:30:25.280902544 +0100 @@ -151,6 +151,7 @@ CFILES = alloca.c argv.c asprintf.c atex 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. ./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 \ --- /home/jbeulich/src/binutils/mainline/2005-01-25.13.54/libiberty/unlink-if-ordinary.c 1970-01-01 01:00:00.000000000 +0100 +++ 2005-01-25.13.54/libiberty/unlink-if-ordinary.c 2004-12-17 10:14:20.000000000 +0100 @@ -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; +}