From 59b9e870243c56a9c5ec045a925e4e9b3f1f6c3c Mon Sep 17 00:00:00 2001 From: Erik Andersen Date: Wed, 10 May 2000 05:05:45 +0000 Subject: * cp -fa now works as expected for symlinks (it didn't before) * zcat works again (wasn't working since option parsing was broken) * more doc updates/more support for BB_FEATURE_SIMPLE_HELP -Erik --- Changelog | 3 +++ Makefile | 2 +- TODO | 2 -- archival/gunzip.c | 9 +++++---- console-tools/deallocvt.c | 6 +++++- coreutils/dd.c | 18 ++++++++++-------- coreutils/df.c | 7 +++++-- coreutils/dirname.c | 6 +++++- coreutils/du.c | 11 +++++++---- coreutils/echo.c | 9 ++++++--- cp_mv.c | 7 ++++--- dd.c | 18 ++++++++++-------- deallocvt.c | 6 +++++- df.c | 7 +++++-- dirname.c | 6 +++++- dmesg.c | 10 +++++++++- du.c | 11 +++++++---- dutmp.c | 9 ++++++--- echo.c | 9 ++++++--- gunzip.c | 9 +++++---- internal.h | 4 ++-- miscutils/dutmp.c | 9 ++++++--- util-linux/dmesg.c | 10 +++++++++- utility.c | 20 +++++++++----------- 24 files changed, 135 insertions(+), 73 deletions(-) diff --git a/Changelog b/Changelog index 8b683ba90..0cd58ef31 100644 --- a/Changelog +++ b/Changelog @@ -27,6 +27,9 @@ * Fixed basename to support stripping of suffixes. Patch thanks to xiong jianxin * More doc updates + * cp -fa now works as expected for symlinks (it didn't before) + * zcat now works (wasn't working since option parsing was broken) + -Erik diff --git a/Makefile b/Makefile index 475d039fa..d7b1a9bdb 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ export VERSION # 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 diff --git a/TODO b/TODO index 8d7ef0e6f..5fe780f39 100644 --- a/TODO +++ b/TODO @@ -17,8 +17,6 @@ around to it some time. If you have any good ideas, please let me know. Bugs that need fixing as of Mon May 8 17:22:06 MDT 2000 - - zcat option parsing broke (maybe replace zcat binary with a shell script?) - - cp -fa doesn't work (-a option parsing probably overrides everything) - 'grep foo$ file' doesn't work - 'grep *foo file' segfaults - ps dirent race bug (need to stat the file before attempting chdir) diff --git a/archival/gunzip.c b/archival/gunzip.c index 97ab84e2d..bdf8dc293 100644 --- a/archival/gunzip.c +++ b/archival/gunzip.c @@ -715,11 +715,12 @@ int gunzip_main(int argc, char **argv) char ifname[MAX_PATH_LEN + 1]; /* input file name */ char ofname[MAX_PATH_LEN + 1]; /* output file name */ - if (argc == 1) - usage(gunzip_usage); - - if (strcmp(*argv, "zcat") == 0) + if (strcmp(*argv, "zcat") == 0) { to_stdout = 1; + if (argc == 1) { + fromstdin = 1; + } + } /* Parse any options */ while (--argc > 0 && **(++argv) == '-') { diff --git a/console-tools/deallocvt.c b/console-tools/deallocvt.c index ee858797c..a1b8e4eea 100644 --- a/console-tools/deallocvt.c +++ b/console-tools/deallocvt.c @@ -19,7 +19,11 @@ int deallocvt_main(int argc, char *argv[]) if ((argc != 2) || (**(argv + 1) == '-')) { usage - ("deallocvt N\n\nDeallocate unused virtual terminal /dev/ttyN\n"); + ("deallocvt N\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nDeallocate unused virtual terminal /dev/ttyN\n" +#endif + ); } progname = argv[0]; diff --git a/coreutils/dd.c b/coreutils/dd.c index 303500008..5d9993d8b 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c @@ -41,17 +41,19 @@ typedef unsigned long long int uintmax_t; #endif static const char dd_usage[] = - "dd [if=name] [of=name] [bs=n] [count=n] [skip=n] [seek=n]\n\n" - "Copy a file, converting and formatting according to options\n\n" + "dd [if=FILE] [of=FILE] [bs=N] [count=N] [skip=N] [seek=N]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nCopy a file, converting and formatting according to options\n\n" "\tif=FILE\tread from FILE instead of stdin\n" "\tof=FILE\twrite to FILE instead of stdout\n" - "\tbs=n\tread and write n bytes at a time\n" - "\tcount=n\tcopy only n input blocks\n" - "\tskip=n\tskip n input blocks\n" - "\tseek=n\tskip n output blocks\n" - + "\tbs=N\tread and write N bytes at a time\n" + "\tcount=N\tcopy only N input blocks\n" + "\tskip=N\tskip N input blocks\n" + "\tseek=N\tskip N output blocks\n" "\n" - "Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)\n"; + "Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)\n" +#endif + ; diff --git a/coreutils/df.c b/coreutils/df.c index c38720454..417065943 100644 --- a/coreutils/df.c +++ b/coreutils/df.c @@ -28,8 +28,11 @@ #include #include -static const char df_usage[] = "df [filesystem ...]\n\n" - "Print the filesystem space used and space available.\n"; +static const char df_usage[] = "df [filesystem ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrint the filesystem space used and space available.\n" +#endif + ; extern const char mtab_file[]; /* Defined in utility.c */ diff --git a/coreutils/dirname.c b/coreutils/dirname.c index 528b89a56..ce3cd6f03 100644 --- a/coreutils/dirname.c +++ b/coreutils/dirname.c @@ -28,7 +28,11 @@ extern int dirname_main(int argc, char **argv) char* s; if ((argc < 2) || (**(argv + 1) == '-')) { - usage("dirname [file ...]\n"); + usage("dirname [FILENAME ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nStrips non-directory suffix from FILENAME\n" +#endif + ); } argv++; diff --git a/coreutils/du.c b/coreutils/du.c index c4fb3a38d..9c699978e 100644 --- a/coreutils/du.c +++ b/coreutils/du.c @@ -36,12 +36,15 @@ typedef void (Display) (long, char *); static const char du_usage[] = - "du [OPTION]... [FILE]...\n\n" - "Summarize disk space used for each FILE and/or directory.\n" + "du [OPTION]... [FILE]...\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nSummarizes disk space used for each FILE and/or directory.\n" "Disk space is printed in units of 1024 bytes.\n\n" "Options:\n" "\t-l\tcount sizes many times if hard linked\n" - "\t-s\tdisplay only a total for each argument\n"; + "\t-s\tdisplay only a total for each argument\n" +#endif + ; static int du_depth = 0; static int count_hardlinks = 0; @@ -181,7 +184,7 @@ int du_main(int argc, char **argv) exit(0); } -/* $Id: du.c,v 1.18 2000/04/28 00:18:56 erik Exp $ */ +/* $Id: du.c,v 1.19 2000/05/10 05:05:45 erik Exp $ */ /* Local Variables: c-file-style: "linux" diff --git a/coreutils/echo.c b/coreutils/echo.c index 2405d0ae1..b31f2229b 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c @@ -26,12 +26,15 @@ #include static const char uname_usage[] = - "echo [-neE] [ARG ...]\n\n" - "Prints the specified ARGs to stdout\n\n" + "echo [-neE] [ARG ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrints the specified ARGs to stdout\n\n" "Options:\n" "\t-n\tsuppress trailing newline\n" "\t-e\tinterpret backslash-escaped characters (i.e. \\t=tab etc)\n" - "\t-E\tdisable interpretation of backslash-escaped characters\n"; + "\t-E\tdisable interpretation of backslash-escaped characters\n" +#endif + ; extern int echo_main(int argc, char** argv) diff --git a/cp_mv.c b/cp_mv.c index ae35bca19..ac1e71b82 100644 --- a/cp_mv.c +++ b/cp_mv.c @@ -70,6 +70,7 @@ static const char *cp_mv_usage[] = /* .rodata */ static int recursiveFlag; static int followLinks; static int preserveFlag; +static int forceFlag; static const char *baseSrcName; static int srcDirFlag; @@ -167,7 +168,7 @@ cp_mv_Action(const char *fileName, struct stat *statbuf, void* junk) add_to_ino_dev_hashtable(statbuf, destName); } } - return copyFile(fileName, destName, preserveFlag, followLinks); + return copyFile(fileName, destName, preserveFlag, followLinks, forceFlag); } static int @@ -200,7 +201,7 @@ extern int cp_mv_main(int argc, char **argv) argv++; if (dz_i == is_cp) { - recursiveFlag = preserveFlag = FALSE; + recursiveFlag = preserveFlag = forceFlag = FALSE; followLinks = TRUE; while (**argv == '-') { while (*++(*argv)) { @@ -220,7 +221,7 @@ extern int cp_mv_main(int argc, char **argv) recursiveFlag = TRUE; break; case 'f': - /* for compatibility; busybox cp/mv always does force */ + forceFlag = TRUE; break; default: usage(cp_mv_usage[is_cp]); diff --git a/dd.c b/dd.c index 303500008..5d9993d8b 100644 --- a/dd.c +++ b/dd.c @@ -41,17 +41,19 @@ typedef unsigned long long int uintmax_t; #endif static const char dd_usage[] = - "dd [if=name] [of=name] [bs=n] [count=n] [skip=n] [seek=n]\n\n" - "Copy a file, converting and formatting according to options\n\n" + "dd [if=FILE] [of=FILE] [bs=N] [count=N] [skip=N] [seek=N]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nCopy a file, converting and formatting according to options\n\n" "\tif=FILE\tread from FILE instead of stdin\n" "\tof=FILE\twrite to FILE instead of stdout\n" - "\tbs=n\tread and write n bytes at a time\n" - "\tcount=n\tcopy only n input blocks\n" - "\tskip=n\tskip n input blocks\n" - "\tseek=n\tskip n output blocks\n" - + "\tbs=N\tread and write N bytes at a time\n" + "\tcount=N\tcopy only N input blocks\n" + "\tskip=N\tskip N input blocks\n" + "\tseek=N\tskip N output blocks\n" "\n" - "Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)\n"; + "Numbers may be suffixed by w (x2), k (x1024), b (x512), or M (x1024^2)\n" +#endif + ; diff --git a/deallocvt.c b/deallocvt.c index ee858797c..a1b8e4eea 100644 --- a/deallocvt.c +++ b/deallocvt.c @@ -19,7 +19,11 @@ int deallocvt_main(int argc, char *argv[]) if ((argc != 2) || (**(argv + 1) == '-')) { usage - ("deallocvt N\n\nDeallocate unused virtual terminal /dev/ttyN\n"); + ("deallocvt N\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nDeallocate unused virtual terminal /dev/ttyN\n" +#endif + ); } progname = argv[0]; diff --git a/df.c b/df.c index c38720454..417065943 100644 --- a/df.c +++ b/df.c @@ -28,8 +28,11 @@ #include #include -static const char df_usage[] = "df [filesystem ...]\n\n" - "Print the filesystem space used and space available.\n"; +static const char df_usage[] = "df [filesystem ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrint the filesystem space used and space available.\n" +#endif + ; extern const char mtab_file[]; /* Defined in utility.c */ diff --git a/dirname.c b/dirname.c index 528b89a56..ce3cd6f03 100644 --- a/dirname.c +++ b/dirname.c @@ -28,7 +28,11 @@ extern int dirname_main(int argc, char **argv) char* s; if ((argc < 2) || (**(argv + 1) == '-')) { - usage("dirname [file ...]\n"); + usage("dirname [FILENAME ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nStrips non-directory suffix from FILENAME\n" +#endif + ); } argv++; diff --git a/dmesg.c b/dmesg.c index 2bbf43a12..6fa17b5fb 100644 --- a/dmesg.c +++ b/dmesg.c @@ -34,7 +34,15 @@ static inline _syscall3(int, klogctl, int, type, char *, b, int, len); # include #endif -static const char dmesg_usage[] = "dmesg [-c] [-n level] [-s bufsize]\n"; +static const char dmesg_usage[] = "dmesg [-c] [-n LEVEL] [-s SIZE]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrints or controls the kernel ring buffer\n\n" + "Options:\n" + "\t-c\t\tClears the ring buffer's contents after printing\n" + "\t-n LEVEL\tSets console logging level\n" + "\t-s SIZE\t\tUse a buffer of size SIZE\n" +#endif + ; int dmesg_main(int argc, char **argv) { diff --git a/du.c b/du.c index c4fb3a38d..9c699978e 100644 --- a/du.c +++ b/du.c @@ -36,12 +36,15 @@ typedef void (Display) (long, char *); static const char du_usage[] = - "du [OPTION]... [FILE]...\n\n" - "Summarize disk space used for each FILE and/or directory.\n" + "du [OPTION]... [FILE]...\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nSummarizes disk space used for each FILE and/or directory.\n" "Disk space is printed in units of 1024 bytes.\n\n" "Options:\n" "\t-l\tcount sizes many times if hard linked\n" - "\t-s\tdisplay only a total for each argument\n"; + "\t-s\tdisplay only a total for each argument\n" +#endif + ; static int du_depth = 0; static int count_hardlinks = 0; @@ -181,7 +184,7 @@ int du_main(int argc, char **argv) exit(0); } -/* $Id: du.c,v 1.18 2000/04/28 00:18:56 erik Exp $ */ +/* $Id: du.c,v 1.19 2000/05/10 05:05:45 erik Exp $ */ /* Local Variables: c-file-style: "linux" diff --git a/dutmp.c b/dutmp.c index 192871f1e..fab1a7b99 100644 --- a/dutmp.c +++ b/dutmp.c @@ -26,9 +26,12 @@ #endif -static const char dutmp_usage[] = "dutmp [FILE]\n\n" - "Dump utmp file format (pipe delimited) from FILE\n" - "or stdin to stdout. (i.e. 'dutmp /var/run/utmp')\n"; +static const char dutmp_usage[] = "dutmp [FILE]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nDump utmp file format (pipe delimited) from FILE\n" + "or stdin to stdout. (i.e. 'dutmp /var/run/utmp')\n" +#endif + ; extern int dutmp_main(int argc, char **argv) { diff --git a/echo.c b/echo.c index 2405d0ae1..b31f2229b 100644 --- a/echo.c +++ b/echo.c @@ -26,12 +26,15 @@ #include static const char uname_usage[] = - "echo [-neE] [ARG ...]\n\n" - "Prints the specified ARGs to stdout\n\n" + "echo [-neE] [ARG ...]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrints the specified ARGs to stdout\n\n" "Options:\n" "\t-n\tsuppress trailing newline\n" "\t-e\tinterpret backslash-escaped characters (i.e. \\t=tab etc)\n" - "\t-E\tdisable interpretation of backslash-escaped characters\n"; + "\t-E\tdisable interpretation of backslash-escaped characters\n" +#endif + ; extern int echo_main(int argc, char** argv) diff --git a/gunzip.c b/gunzip.c index 97ab84e2d..bdf8dc293 100644 --- a/gunzip.c +++ b/gunzip.c @@ -715,11 +715,12 @@ int gunzip_main(int argc, char **argv) char ifname[MAX_PATH_LEN + 1]; /* input file name */ char ofname[MAX_PATH_LEN + 1]; /* output file name */ - if (argc == 1) - usage(gunzip_usage); - - if (strcmp(*argv, "zcat") == 0) + if (strcmp(*argv, "zcat") == 0) { to_stdout = 1; + if (argc == 1) { + fromstdin = 1; + } + } /* Parse any options */ while (--argc > 0 && **(++argv) == '-') { diff --git a/internal.h b/internal.h index 859bee1c3..a4014778c 100644 --- a/internal.h +++ b/internal.h @@ -215,8 +215,8 @@ int is_in_ino_dev_hashtable(const struct stat *statbuf, char **name); void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name); void reset_ino_dev_hashtable(void); -int copyFile(const char *srcName, const char *destName, int setModes, - int followLinks); +int copyFile(const char *srcName, const char *destName, + int setModes, int followLinks, int forceFlag); char *buildName(const char *dirName, const char *fileName); int makeString(int argc, const char **argv, char *buf, int bufLen); char *getChunk(int size); diff --git a/miscutils/dutmp.c b/miscutils/dutmp.c index 192871f1e..fab1a7b99 100644 --- a/miscutils/dutmp.c +++ b/miscutils/dutmp.c @@ -26,9 +26,12 @@ #endif -static const char dutmp_usage[] = "dutmp [FILE]\n\n" - "Dump utmp file format (pipe delimited) from FILE\n" - "or stdin to stdout. (i.e. 'dutmp /var/run/utmp')\n"; +static const char dutmp_usage[] = "dutmp [FILE]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nDump utmp file format (pipe delimited) from FILE\n" + "or stdin to stdout. (i.e. 'dutmp /var/run/utmp')\n" +#endif + ; extern int dutmp_main(int argc, char **argv) { diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c index 2bbf43a12..6fa17b5fb 100644 --- a/util-linux/dmesg.c +++ b/util-linux/dmesg.c @@ -34,7 +34,15 @@ static inline _syscall3(int, klogctl, int, type, char *, b, int, len); # include #endif -static const char dmesg_usage[] = "dmesg [-c] [-n level] [-s bufsize]\n"; +static const char dmesg_usage[] = "dmesg [-c] [-n LEVEL] [-s SIZE]\n" +#ifndef BB_FEATURE_TRIVIAL_HELP + "\nPrints or controls the kernel ring buffer\n\n" + "Options:\n" + "\t-c\t\tClears the ring buffer's contents after printing\n" + "\t-n LEVEL\tSets console logging level\n" + "\t-s SIZE\t\tUse a buffer of size SIZE\n" +#endif + ; int dmesg_main(int argc, char **argv) { diff --git a/utility.c b/utility.c index c8442f1ba..5899fe954 100644 --- a/utility.c +++ b/utility.c @@ -234,15 +234,14 @@ int isDirectory(const char *fileName, const int followLinks, struct stat *statBu #if defined (BB_CP_MV) /* - * Copy one file to another, while possibly preserving its modes, times, - * and modes. Returns TRUE if successful, or FALSE on a failure with an - * error message output. (Failure is not indicated if the attributes cannot - * be set.) - * -Erik Andersen + * Copy one file to another, while possibly preserving its modes, times, and + * modes. Returns TRUE if successful, or FALSE on a failure with an error + * message output. (Failure is not indicated if attributes cannot be set.) + * -Erik Andersen */ int copyFile(const char *srcName, const char *destName, - int setModes, int followLinks) + int setModes, int followLinks, int forceFlag) { int rfd; int wfd; @@ -268,7 +267,8 @@ copyFile(const char *srcName, const char *destName, else status = lstat(destName, &dstStatBuf); - if (status < 0) { + if (status < 0 || forceFlag==TRUE) { + unlink(destName); dstStatBuf.st_ino = -1; dstStatBuf.st_dev = -1; } @@ -306,10 +306,8 @@ copyFile(const char *srcName, const char *destName, } #if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1) if (setModes == TRUE) { - if (lchown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid) < 0) { - perror(destName); - return FALSE; - } + /* Try to set owner, but fail silently like GNU cp */ + lchown(destName, srcStatBuf.st_uid, srcStatBuf.st_gid); } #endif return TRUE; -- cgit v1.2.3