summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>2006-03-26 12:18:51 +0000
committerJim Meyering <jim@meyering.net>2006-03-26 12:18:51 +0000
commit7029f979e5f93cb2b7b4bb17a1ad3b2184369620 (patch)
treec1fe0b263b1db47e1addb8667fb5bf78df78688f /lib
parentcb916337dce4d713ab5946ab4825b3b159579455 (diff)
downloadcoreutils-7029f979e5f93cb2b7b4bb17a1ad3b2184369620.tar.xz
(strip_trailing_slashes): Use last_component, not base_name.
Strip redundant slashes from ///.
Diffstat (limited to 'lib')
-rw-r--r--lib/stripslash.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/lib/stripslash.c b/lib/stripslash.c
index 9b55da48e..4ba5dadbe 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;
}