summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog3
-rw-r--r--Makefile2
-rw-r--r--TODO2
-rw-r--r--archival/gunzip.c9
-rw-r--r--console-tools/deallocvt.c6
-rw-r--r--coreutils/dd.c18
-rw-r--r--coreutils/df.c7
-rw-r--r--coreutils/dirname.c6
-rw-r--r--coreutils/du.c11
-rw-r--r--coreutils/echo.c9
-rw-r--r--cp_mv.c7
-rw-r--r--dd.c18
-rw-r--r--deallocvt.c6
-rw-r--r--df.c7
-rw-r--r--dirname.c6
-rw-r--r--dmesg.c10
-rw-r--r--du.c11
-rw-r--r--dutmp.c9
-rw-r--r--echo.c9
-rw-r--r--gunzip.c9
-rw-r--r--internal.h4
-rw-r--r--miscutils/dutmp.c9
-rw-r--r--util-linux/dmesg.c10
-rw-r--r--utility.c20
24 files changed, 135 insertions, 73 deletions
diff --git a/Changelog b/Changelog
index 8b683ba..0cd58ef 100644
--- a/Changelog
+++ b/Changelog
@@ -27,6 +27,9 @@
* Fixed basename to support stripping of suffixes. Patch thanks
to xiong jianxin <jxiong@uiuc.edu>
* 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 475d039..d7b1a9b 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 8d7ef0e..5fe780f 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 97ab84e..bdf8dc2 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 ee85879..a1b8e4e 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 3035000..5d9993d 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 c387204..4170659 100644
--- a/coreutils/df.c
+++ b/coreutils/df.c
@@ -28,8 +28,11 @@
#include <sys/stat.h>
#include <sys/vfs.h>
-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 528b89a..ce3cd6f 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 c4fb3a3..9c69997 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 2405d0a..b31f222 100644
--- a/coreutils/echo.c
+++ b/coreutils/echo.c
@@ -26,12 +26,15 @@
#include <stdio.h>
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 ae35bca..ac1e71b 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 3035000..5d9993d 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 ee85879..a1b8e4e 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 c387204..4170659 100644
--- a/df.c
+++ b/df.c
@@ -28,8 +28,11 @@
#include <sys/stat.h>
#include <sys/vfs.h>
-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 528b89a..ce3cd6f 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 2bbf43a..6fa17b5 100644
--- a/dmesg.c
+++ b/dmesg.c
@@ -34,7 +34,15 @@ static inline _syscall3(int, klogctl, int, type, char *, b, int, len);
# include <sys/klog.h>
#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 c4fb3a3..9c69997 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 192871f..fab1a7b 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 2405d0a..b31f222 100644
--- a/echo.c
+++ b/echo.c
@@ -26,12 +26,15 @@
#include <stdio.h>
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 97ab84e..bdf8dc2 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 859bee1..a401477 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 192871f..fab1a7b 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 2bbf43a..6fa17b5 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 <sys/klog.h>
#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 c8442f1..5899fe9 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;