* Fixed all fatalError() calls lacking a "\n", thanks to Pavel Roskin.
* Fixed a segfault in yes when no args were given -- Pavel Roskin.
* Simplified freeramdisk and added argument checking -- Pavel Roskin.
+ * Fixed segfault caused by "touch -c"
+ * Fixed segfault caused by "rm -f"
+ * Fixed segfault caused by "ln -s -s" and similar abuses.
+ * Fixed segfault caused by "cp -a -a" and similar abuses.
+ * Implemented "rm -- <foo>"
* "which" rewritten to use stat(). Fixes to improve its compatability
with traditional implementations -- Pavel Roskin.
* More doc updates
# Set the following to `true' to make a debuggable build.
# Leave this set to `false' for production use.
# eg: `make DODEBUG=true tests'
-DODEBUG = false
+DODEBUG = true
# If you want a static binary, turn this on.
DOSTATIC = false
chmod -R
chown -R
chgrp -R
- cp -a -a
- ln -s -s
- rm -f
- rm -f -
- rm -- -
- touch -c
- I believe that swaponoff may also be also broken (check it).
- It used to be that BusyBox tar would happily overwrite existing files on
an extraction. However, as of 0.42, BusyBox tar simply dies as soon as an
argv++;
/* Parse any options */
- while (**argv == '-') {
- while (*++(*argv))
- switch (**argv) {
- case 's':
- symlinkFlag = TRUE;
- break;
- case 'f':
- removeoldFlag = TRUE;
- break;
- case 'n':
- followLinks = FALSE;
- break;
- default:
- usage(ln_usage);
- }
- argc--;
+ while (--argc >= 0 && *argv && **argv) {
+ while (**argv == '-') {
+ while (*++(*argv))
+ switch (**argv) {
+ case 's':
+ symlinkFlag = TRUE;
+ break;
+ case 'f':
+ removeoldFlag = TRUE;
+ break;
+ case 'n':
+ followLinks = FALSE;
+ break;
+ default:
+ usage(ln_usage);
+ }
+ }
argv++;
}
+ if (argc < 1) {
+ fatalError("ln: missing file argument\n");
+ }
+
linkName = argv[argc - 1];
if (strlen(linkName) > BUFSIZ) {
static const char *rm_usage = "rm [OPTION]... FILE...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nRemove (unlink) the FILE(s).\n\n"
+ "\nRemove (unlink) the FILE(s). You may use '--' to\n"
+ "indicate that all following arguments are non-options.\n\n"
"Options:\n"
"\t-f\t\tremove existing destinations, never prompt\n"
"\t-r or -R\tremove the contents of directories recursively\n"
extern int rm_main(int argc, char **argv)
{
+ int stopIt=FALSE;
struct stat statbuf;
if (argc < 2) {
usage(rm_usage);
}
- argc--;
argv++;
/* Parse any options */
- while (**argv == '-') {
- while (*++(*argv))
- switch (**argv) {
- case 'R':
- case 'r':
- recursiveFlag = TRUE;
- break;
- case 'f':
- forceFlag = TRUE;
- break;
- default:
- usage(rm_usage);
- }
- argc--;
+ while (--argc >= 0 && *argv && **argv && stopIt==FALSE) {
+ while (**argv == '-') {
+ while (*++(*argv))
+ switch (**argv) {
+ case 'R':
+ case 'r':
+ recursiveFlag = TRUE;
+ break;
+ case 'f':
+ forceFlag = TRUE;
+ break;
+ case '-':
+ stopIt = TRUE;
+ break;
+ default:
+ usage(rm_usage);
+ }
+ }
argv++;
}
if (dz_i == is_cp) {
recursiveFlag = preserveFlag = forceFlag = FALSE;
followLinks = TRUE;
- while (**argv == '-') {
- while (*++(*argv)) {
- switch (**argv) {
- case 'a':
- followLinks = FALSE;
- preserveFlag = TRUE;
- recursiveFlag = TRUE;
- break;
- case 'd':
- followLinks = FALSE;
- break;
- case 'p':
- preserveFlag = TRUE;
- break;
- case 'R':
- recursiveFlag = TRUE;
- break;
- case 'f':
- forceFlag = TRUE;
- break;
- default:
- usage(cp_mv_usage[is_cp]);
+ while (--argc >= 0 && *argv && **argv) {
+ while (**argv == '-') {
+ while (*++(*argv)) {
+ switch (**argv) {
+ case 'a':
+ followLinks = FALSE;
+ preserveFlag = TRUE;
+ recursiveFlag = TRUE;
+ break;
+ case 'd':
+ followLinks = FALSE;
+ break;
+ case 'p':
+ preserveFlag = TRUE;
+ break;
+ case 'R':
+ recursiveFlag = TRUE;
+ break;
+ case 'f':
+ forceFlag = TRUE;
+ break;
+ default:
+ usage(cp_mv_usage[is_cp]);
+ }
}
}
- argc--;
argv++;
}
+ if (argc < 1) {
+ fatalError("cp: missing file argument\n");
+ }
} else { /* (dz_i == is_mv) */
recursiveFlag = preserveFlag = TRUE;
followLinks = FALSE;
}
+
if (strlen(argv[argc - 1]) > BUFSIZ) {
fprintf(stderr, name_too_long, "cp");
Usage: rm [OPTION]... FILE...
-Remove (unlink) the FILE(s).
+Remove (unlink) the FILE(s). You may use '--' to
+indicate that all following arguments are non-options.
Options:
=cut
-# $Id: busybox.pod,v 1.34 2000/06/05 17:23:06 andersen Exp $
+# $Id: busybox.pod,v 1.35 2000/06/06 16:15:23 andersen Exp $
argv++;
/* Parse any options */
- while (**argv == '-') {
- while (*++(*argv))
- switch (**argv) {
- case 's':
- symlinkFlag = TRUE;
- break;
- case 'f':
- removeoldFlag = TRUE;
- break;
- case 'n':
- followLinks = FALSE;
- break;
- default:
- usage(ln_usage);
- }
- argc--;
+ while (--argc >= 0 && *argv && **argv) {
+ while (**argv == '-') {
+ while (*++(*argv))
+ switch (**argv) {
+ case 's':
+ symlinkFlag = TRUE;
+ break;
+ case 'f':
+ removeoldFlag = TRUE;
+ break;
+ case 'n':
+ followLinks = FALSE;
+ break;
+ default:
+ usage(ln_usage);
+ }
+ }
argv++;
}
+ if (argc < 1) {
+ fatalError("ln: missing file argument\n");
+ }
+
linkName = argv[argc - 1];
if (strlen(linkName) > BUFSIZ) {
fprintf(stderr,
"\t-n [14|30]\tSpecify the maximum length of filenames\n");
fprintf(stderr,
- "\t-i\t\tSpecify the number of inodes for the filesystem\n");
+ "\t-i INODES\tSpecify the number of inodes for the filesystem\n");
fprintf(stderr,
"\t-l FILENAME\tRead the bad blocks list from FILENAME\n");
fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n");
static const char *rm_usage = "rm [OPTION]... FILE...\n"
#ifndef BB_FEATURE_TRIVIAL_HELP
- "\nRemove (unlink) the FILE(s).\n\n"
+ "\nRemove (unlink) the FILE(s). You may use '--' to\n"
+ "indicate that all following arguments are non-options.\n\n"
"Options:\n"
"\t-f\t\tremove existing destinations, never prompt\n"
"\t-r or -R\tremove the contents of directories recursively\n"
extern int rm_main(int argc, char **argv)
{
+ int stopIt=FALSE;
struct stat statbuf;
if (argc < 2) {
usage(rm_usage);
}
- argc--;
argv++;
/* Parse any options */
- while (**argv == '-') {
- while (*++(*argv))
- switch (**argv) {
- case 'R':
- case 'r':
- recursiveFlag = TRUE;
- break;
- case 'f':
- forceFlag = TRUE;
- break;
- default:
- usage(rm_usage);
- }
- argc--;
+ while (--argc >= 0 && *argv && **argv && stopIt==FALSE) {
+ while (**argv == '-') {
+ while (*++(*argv))
+ switch (**argv) {
+ case 'R':
+ case 'r':
+ recursiveFlag = TRUE;
+ break;
+ case 'f':
+ forceFlag = TRUE;
+ break;
+ case '-':
+ stopIt = TRUE;
+ break;
+ default:
+ usage(rm_usage);
+ }
+ }
argv++;
}
fprintf(stderr,
"\t-n [14|30]\tSpecify the maximum length of filenames\n");
fprintf(stderr,
- "\t-i\t\tSpecify the number of inodes for the filesystem\n");
+ "\t-i INODES\tSpecify the number of inodes for the filesystem\n");
fprintf(stderr,
"\t-l FILENAME\tRead the bad blocks list from FILENAME\n");
fprintf(stderr, "\t-v\t\tMake a Minix version 2 filesystem\n\n");