Use basename() where appropriate.
diff --git a/main.c b/main.c
index bf89ef2..9370efd 100644
--- a/main.c
+++ b/main.c
@@ -146,16 +146,8 @@
{
if (CFG_TOYBOX_I18N) setlocale(LC_ALL, "");
- // Artificial scope to eat less stack for things we call
- {
- char *name;
-
- // Trim path off of command name
- name = strrchr(argv[0], '/');
- if (!name) name=argv[0];
- else name++;
- argv[0] = name;
- }
+ // Trim path off of command name
+ *argv = basename(*argv);
// Call the multiplexer, adjusting this argv[] to be its' argv[1].
// (It will adjust it back before calling toy_exec().)
diff --git a/scripts/test/chgrp.test b/scripts/test/chgrp.test
index 9c7142a..2af9385 100755
--- a/scripts/test/chgrp.test
+++ b/scripts/test/chgrp.test
@@ -2,8 +2,6 @@
[ -f testing.sh ] && . testing.sh
-VERBOSE=1
-
if [ "$(id -u)" -ne 0 ]
then
echo "SKIPPED: chgrp (not root)"
diff --git a/scripts/test/rmdir.test b/scripts/test/rmdir.test
index bea7588..a7b027e 100755
--- a/scripts/test/rmdir.test
+++ b/scripts/test/rmdir.test
@@ -45,6 +45,10 @@
testing "rmdir -p one/two/three" \
"rmdir -p one/two/three && [ ! -e one ] && echo yes" "yes\n" "" ""
+mkdir -p one/two/three
+testing "rmdir -p one/two/three/" \
+ "rmdir -p one/two/three/ && [ ! -e one ] && echo yes" "yes\n" "" ""
+
#mkdir -p one/two/three
#chmod 000 one/two/three one/two one
#testing "rmdir -p one/two/three" \
diff --git a/scripts/test/testing.sh b/scripts/test/testing.sh
index 0f72bce..b7eacc6 100644
--- a/scripts/test/testing.sh
+++ b/scripts/test/testing.sh
@@ -74,7 +74,7 @@
echo -ne "$5" | eval "$2" > actual
RETVAL=$?
- cmp expected actual > /dev/null
+ cmp expected actual > /dev/null 2>&1
if [ $? -ne 0 ]
then
FAILCOUNT=$[$FAILCOUNT+1]
diff --git a/toys/other/rmmod.c b/toys/other/rmmod.c
index 093eb8a..b789acc 100644
--- a/toys/other/rmmod.c
+++ b/toys/other/rmmod.c
@@ -29,9 +29,7 @@
int len;
// Basename
- mod_name = strrchr(toys.optargs[0],'/');
- if (mod_name) mod_name++;
- else mod_name = toys.optargs[0];
+ mod_name = basename(*toys.optargs);
// Remove .ko if present
len = strlen(mod_name);
diff --git a/toys/posix/ln.c b/toys/posix/ln.c
index fea6fff..d69aabf 100644
--- a/toys/posix/ln.c
+++ b/toys/posix/ln.c
@@ -47,11 +47,8 @@
int rc;
char *try = toys.optargs[i];
- if (S_ISDIR(buf.st_mode)) {
- new = strrchr(try, '/');
- if (!new) new = try;
- new = xmsprintf("%s/%s", dest, new);
- } else new = dest;
+ if (S_ISDIR(buf.st_mode)) new = xmsprintf("%s/%s", dest, basename(try));
+ else new = dest;
/* Silently unlink the existing target. If it doesn't exist,
* then we just move on */
if (toys.optflags & FLAG_f) unlink(new);
diff --git a/toys/posix/rmdir.c b/toys/posix/rmdir.c
index 289b015..fec3ce9 100644
--- a/toys/posix/rmdir.c
+++ b/toys/posix/rmdir.c
@@ -20,16 +20,21 @@
static void do_rmdir(char *name)
{
- for (;;) {
- char *temp;
+ char *temp;
+ for (;;) {
if (rmdir(name)) {
perror_msg("%s",name);
return;
}
+
+ // Each -p cycle back up one slash, ignoring trailing and repeated /.
+
if (!toys.optflags) return;
- if (!(temp=strrchr(name,'/'))) return;
- *temp=0;
+ do {
+ if (!(temp = strrchr(name, '/'))) return;
+ *temp = 0;
+ } while (!temp[1]);
}
}