summaryrefslogtreecommitdiffstats
path: root/lib/stripslash.c
diff options
context:
space:
mode:
authorClaudio Fontana <sick_soul@users.sourceforge.net>2006-07-21 23:40:02 +0000
committerClaudio Fontana <sick_soul@users.sourceforge.net>2006-07-21 23:40:02 +0000
commit9a72ecd6dc36eab0497dc428d10a6ad1dd87a19a (patch)
treea528fd617cda36f619bc076429b0995bcda12e2c /lib/stripslash.c
parentee29ecd605b329c38ab4c6c6c89d6288693495de (diff)
downloadidutils-9a72ecd6dc36eab0497dc428d10a6ad1dd87a19a.tar.gz
idutils-9a72ecd6dc36eab0497dc428d10a6ad1dd87a19a.tar.bz2
idutils-9a72ecd6dc36eab0497dc428d10a6ad1dd87a19a.zip
* upgraded gnulib
Diffstat (limited to 'lib/stripslash.c')
-rw-r--r--lib/stripslash.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/stripslash.c b/lib/stripslash.c
index 9b55da4..4ba5dad 100644
--- a/lib/stripslash.c
+++ b/lib/stripslash.c
@@ -1,6 +1,6 @@
/* stripslash.c -- remove redundant trailing slashes from a file name
- Copyright (C) 1990, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1990, 2001, 2003-2006 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -22,19 +22,26 @@
#include "dirname.h"
-/* Remove trailing slashes from FILE.
- Return true if a trailing slash was removed.
- This is useful when using file name completion from a shell that
- adds a "/" after directory names (such as tcsh and bash), because
- the Unix rename and rmdir system calls return an "Invalid argument" error
- when given a file that ends in "/" (except for the root directory). */
+/* Remove trailing slashes from FILE. Return true if a trailing slash
+ was removed. This is useful when using file name completion from a
+ shell that adds a "/" after directory names (such as tcsh and
+ bash), because on symlinks to directories, several system calls
+ have different semantics according to whether a trailing slash is
+ present. */
bool
strip_trailing_slashes (char *file)
{
- char *base = base_name (file);
- char *base_lim = base + base_len (base);
- bool had_slash = (*base_lim != '\0');
+ char *base = last_component (file);
+ char *base_lim;
+ bool had_slash;
+
+ /* last_component returns "" for file system roots, but we need to turn
+ `///' into `/'. */
+ if (! *base)
+ base = file;
+ base_lim = base + base_len (base);
+ had_slash = (*base_lim != '\0');
*base_lim = '\0';
return had_slash;
}