aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile32
-rw-r--r--applets/busybox.c12
-rwxr-xr-xapplets/busybox.mkll16
-rw-r--r--archival/gzip.c18
-rw-r--r--archival/tar.c167
-rw-r--r--busybox.c12
-rw-r--r--busybox.def.h13
-rwxr-xr-xbusybox.mkll16
-rw-r--r--coreutils/df.c61
-rw-r--r--df.c61
-rw-r--r--dmesg.c6
-rw-r--r--find.c133
-rw-r--r--findutils/find.c133
-rw-r--r--findutils/grep.c2
-rw-r--r--grep.c2
-rw-r--r--gzip.c18
-rw-r--r--internal.h2
-rw-r--r--tar.c167
-rw-r--r--util-linux/dmesg.c6
-rw-r--r--utility.c136
-rw-r--r--zcat.c14
21 files changed, 597 insertions, 430 deletions
diff --git a/Makefile b/Makefile
index 535c4d7f8..2b999f088 100644
--- a/Makefile
+++ b/Makefile
@@ -1,30 +1,38 @@
VERSION=0.29alpha1
BUILDTIME=$(shell date "+%Y%m%d-%H%M")
+DODEBUG=true
#This will choke on a non-debian system
ARCH=`uname -m | sed -e 's/i.86/i386/' | sed -e 's/sparc.*/sparc/'`
-STRIP= strip --remove-section=.note --remove-section=.comment busybox
-LDFLAGS= -s
-
# -D_GNU_SOURCE is needed because environ is used in init.c
-CFLAGS=-Wall -O2 -fomit-frame-pointer -fno-builtin -D_GNU_SOURCE
-# For debugging only
-#CFLAGS=-Wall -g -D_GNU_SOURCE
+ifeq ($(DODEBUG),true)
+ CFLAGS=-Wall -g -D_GNU_SOURCE
+ STRIP=
+else
+ CFLAGS=-Wall -O2 -fomit-frame-pointer -fno-builtin -D_GNU_SOURCE
+ STRIP= strip --remove-section=.note --remove-section=.comment busybox
+endif
+
+ifndef $(prefix)
+ prefix=`pwd`
+endif
+BINDIR=$(prefix)
+
+LDFLAGS= -s
LIBRARIES=-lc
OBJECTS=$(shell ./busybox.sh) utility.o
-
CFLAGS+= -DBB_VER='"$(VERSION)"'
CFLAGS+= -DBB_BT='"$(BUILDTIME)"'
-#all: busybox links
-all: busybox
+all: busybox links
+#all: busybox
busybox: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) -o busybox $(OBJECTS) $(LIBRARIES)
- #$(STRIP)
+ $(STRIP)
links:
- ./busybox.mkll | sort >busybox.links
@@ -38,3 +46,7 @@ distclean: clean
force:
$(OBJECTS): busybox.def.h internal.h Makefile
+
+install: busybox
+ install.sh $(BINDIR)
+
diff --git a/applets/busybox.c b/applets/busybox.c
index 9986af389..c36bc2626 100644
--- a/applets/busybox.c
+++ b/applets/busybox.c
@@ -195,6 +195,7 @@ int main(int argc, char **argv)
int busybox_main(int argc, char **argv)
{
+ int col=0;
argc--;
argv++;
@@ -208,18 +209,19 @@ int busybox_main(int argc, char **argv)
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n",
BB_VER, BB_BT);
fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
+ fprintf(stderr, "or\nUsage: [function] [arguments]...\n");
fprintf(stderr,
"\n\tMost people will create a symlink to busybox for each\n"
"\tfunction name, and busybox will act like whatever you invoke it as.\n");
fprintf(stderr, "\nCurrently defined functions:\n");
- if (a->name != 0) {
- fprintf(stderr, "%s", a->name);
- a++;
- }
while (a->name != 0) {
- fprintf(stderr, ", %s", a->name);
+ col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), a->name);
a++;
+ if (col>60) {
+ fprintf(stderr, ",\n");
+ col=0;
+ }
}
fprintf(stderr, "\n\n");
exit(-1);
diff --git a/applets/busybox.mkll b/applets/busybox.mkll
index e43a1ccb0..f79462b7f 100755
--- a/applets/busybox.mkll
+++ b/applets/busybox.mkll
@@ -2,16 +2,14 @@
#Make busybox links list file
DF="busybox.def.h"
-MF="main.c"
+MF="busybox.c"
LIST="$(sed -n '/^#define/{s/^#define //p;}' $DF)"
- for def in ${LIST}; do
-
- set -- $(sed -n '/^#ifdef '$def'[ +| +].*/,/^#endif/{s/.*\/\///p; /^{ /{ s/^{ "//; s/",.*$//p;}; }' $MF)
- path=$1; shift
-
- for n in $@; do
- echo "$path/$n"
- done
+for def in ${LIST}; do
+ i=`sed -n 's/^#ifdef '$def'.*\/\/\(.*$\)/\/\1\//gp' $MF`
+ j=`sed -n '/^#ifdef '$def'.*/,/^#endif/{ s/.*\"\(.*\)\".*/\1/gp; }' $MF`
+ for k in $j; do
+ echo $i$k
done
+done
diff --git a/archival/gzip.c b/archival/gzip.c
index 6fd2e3971..4b1d32ddd 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -380,7 +380,7 @@ extern int block_mode; /* block compress mode -C compatible with 2.0 */
# undef LZW
#endif
-/* $Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $ */
+/* $Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $ */
/* tailor.h -- target dependent definitions
* Copyright (C) 1992-1993 Jean-loup Gailly.
* This is free software; you can redistribute it and/or modify it under the
@@ -391,7 +391,7 @@ extern int block_mode; /* block compress mode -C compatible with 2.0 */
* The target dependent functions should be defined in tailor.c.
*/
-/* $Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $ */
+/* $Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $ */
#if defined(__MSDOS__) && !defined(MSDOS)
# define MSDOS
@@ -767,7 +767,7 @@ extern int block_mode; /* block compress mode -C compatible with 2.0 */
#endif
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* ===========================================================================
@@ -976,7 +976,7 @@ void copy_block(buf, len, header)
#include <stdio.h>
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* ===========================================================================
@@ -1592,7 +1592,7 @@ ulg deflate()
*/
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
@@ -1781,7 +1781,7 @@ static int (*work) OF((int infile, int outfile)) = zip; /* function to call */
// int main (argc, argv)
// int argc;
// char **argv;
-int gzip_main(struct FileInfo * i, int argc, char * * argv)
+int gzip_main(int argc, char * * argv)
{
foreground = signal(SIGINT, SIG_IGN) != SIG_IGN;
if (foreground) {
@@ -1925,7 +1925,7 @@ local void do_exit(int exitcode)
#include <ctype.h>
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* ===========================================================================
@@ -2943,7 +2943,7 @@ local void set_file_type()
*/
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
@@ -3142,7 +3142,7 @@ void display_ratio(num, den, file)
*/
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
diff --git a/archival/tar.c b/archival/tar.c
index 03da96735..498d4a300 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -131,14 +131,10 @@ static void writeHeader(const char * fileName,
static void writeTarFile(int fileCount, char ** fileTable);
static void writeTarBlock(const char * buf, int len);
static BOOL putOctal(char * cp, int len, long value);
-extern const char * modeString(int mode);
-extern const char * timeString(time_t timeVal);
-extern int fullWrite(int fd, const char * buf, int len);
-extern int fullRead(int fd, char * buf, int len);
extern int
-tar_main(struct FileInfo *unused, int argc, char ** argv)
+tar_main(int argc, char ** argv)
{
const char * options;
@@ -1258,167 +1254,6 @@ wantFileName(const char * fileName, int fileCount, char ** fileTable)
-/*
- * Return the standard ls-like mode string from a file mode.
- * This is static and so is overwritten on each call.
- */
-const char *
-modeString(int mode)
-{
- static char buf[12];
-
- strcpy(buf, "----------");
-
- /*
- * Fill in the file type.
- */
- if (S_ISDIR(mode))
- buf[0] = 'd';
- if (S_ISCHR(mode))
- buf[0] = 'c';
- if (S_ISBLK(mode))
- buf[0] = 'b';
- if (S_ISFIFO(mode))
- buf[0] = 'p';
-#ifdef S_ISLNK
- if (S_ISLNK(mode))
- buf[0] = 'l';
-#endif
-#ifdef S_ISSOCK
- if (S_ISSOCK(mode))
- buf[0] = 's';
-#endif
-
- /*
- * Now fill in the normal file permissions.
- */
- if (mode & S_IRUSR)
- buf[1] = 'r';
- if (mode & S_IWUSR)
- buf[2] = 'w';
- if (mode & S_IXUSR)
- buf[3] = 'x';
- if (mode & S_IRGRP)
- buf[4] = 'r';
- if (mode & S_IWGRP)
- buf[5] = 'w';
- if (mode & S_IXGRP)
- buf[6] = 'x';
- if (mode & S_IROTH)
- buf[7] = 'r';
- if (mode & S_IWOTH)
- buf[8] = 'w';
- if (mode & S_IXOTH)
- buf[9] = 'x';
-
- /*
- * Finally fill in magic stuff like suid and sticky text.
- */
- if (mode & S_ISUID)
- buf[3] = ((mode & S_IXUSR) ? 's' : 'S');
- if (mode & S_ISGID)
- buf[6] = ((mode & S_IXGRP) ? 's' : 'S');
- if (mode & S_ISVTX)
- buf[9] = ((mode & S_IXOTH) ? 't' : 'T');
-
- return buf;
-}
-
-
-/*
- * Get the time string to be used for a file.
- * This is down to the minute for new files, but only the date for old files.
- * The string is returned from a static buffer, and so is overwritten for
- * each call.
- */
-const char *
-timeString(time_t timeVal)
-{
- time_t now;
- char * str;
- static char buf[26];
-
- time(&now);
-
- str = ctime(&timeVal);
-
- strcpy(buf, &str[4]);
- buf[12] = '\0';
-
- if ((timeVal > now) || (timeVal < now - 365*24*60*60L))
- {
- strcpy(&buf[7], &str[20]);
- buf[11] = '\0';
- }
-
- return buf;
-}
-
-
-
-/*
- * Write all of the supplied buffer out to a file.
- * This does multiple writes as necessary.
- * Returns the amount written, or -1 on an error.
- */
-int
-fullWrite(int fd, const char * buf, int len)
-{
- int cc;
- int total;
-
- total = 0;
-
- while (len > 0)
- {
- cc = write(fd, buf, len);
-
- if (cc < 0)
- return -1;
-
- buf += cc;
- total+= cc;
- len -= cc;
- }
-
- return total;
-}
-
-
-/*
- * Read all of the supplied buffer from a file.
- * This does multiple reads as necessary.
- * Returns the amount read, or -1 on an error.
- * A short read is returned on an end of file.
- */
-int
-fullRead(int fd, char * buf, int len)
-{
- int cc;
- int total;
-
- total = 0;
-
- while (len > 0)
- {
- cc = read(fd, buf, len);
-
- if (cc < 0)
- return -1;
-
- if (cc == 0)
- break;
-
- buf += cc;
- total+= cc;
- len -= cc;
- }
-
- return total;
-}
-
-
-
#endif
/* END CODE */
diff --git a/busybox.c b/busybox.c
index 9986af389..c36bc2626 100644
--- a/busybox.c
+++ b/busybox.c
@@ -195,6 +195,7 @@ int main(int argc, char **argv)
int busybox_main(int argc, char **argv)
{
+ int col=0;
argc--;
argv++;
@@ -208,18 +209,19 @@ int busybox_main(int argc, char **argv)
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n",
BB_VER, BB_BT);
fprintf(stderr, "Usage: busybox [function] [arguments]...\n");
+ fprintf(stderr, "or\nUsage: [function] [arguments]...\n");
fprintf(stderr,
"\n\tMost people will create a symlink to busybox for each\n"
"\tfunction name, and busybox will act like whatever you invoke it as.\n");
fprintf(stderr, "\nCurrently defined functions:\n");
- if (a->name != 0) {
- fprintf(stderr, "%s", a->name);
- a++;
- }
while (a->name != 0) {
- fprintf(stderr, ", %s", a->name);
+ col+=fprintf(stderr, "%s%s", ((col==0)? "\t":", "), a->name);
a++;
+ if (col>60) {
+ fprintf(stderr, ",\n");
+ col=0;
+ }
}
fprintf(stderr, "\n\n");
exit(-1);
diff --git a/busybox.def.h b/busybox.def.h
index 0149cc3bb..111aca63d 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -14,15 +14,14 @@
#define BB_DATE
#define BB_DD
//#define BB_DESCEND
-//#define BB_DF
+#define BB_DF
#define BB_DMESG
//#define BB_DUTMP
//#define BB_DYADIC
#define BB_FALSE
//#define BB_FDFLUSH
-//#define BB_FIND
-//#define BB_FINDMOUNT
-//#define BB_GREP
+#define BB_FIND
+#define BB_GREP
////#define BB_HALT
//#define BB_INIT
//#define BB_KILL
@@ -53,11 +52,11 @@
////#define BB_SWAPOFF
//#define BB_SWAPON
//#define BB_SYNC
-//#define BB_TAR
+#define BB_TAR
//#define BB_TOUCH
#define BB_TRUE
//#define BB_UMOUNT
//#define BB_UPDATE
//#define BB_UTILITY
-//#define BB_ZCAT
-//#define BB_GZIP
+#define BB_ZCAT
+#define BB_GZIP
diff --git a/busybox.mkll b/busybox.mkll
index e43a1ccb0..f79462b7f 100755
--- a/busybox.mkll
+++ b/busybox.mkll
@@ -2,16 +2,14 @@
#Make busybox links list file
DF="busybox.def.h"
-MF="main.c"
+MF="busybox.c"
LIST="$(sed -n '/^#define/{s/^#define //p;}' $DF)"
- for def in ${LIST}; do
-
- set -- $(sed -n '/^#ifdef '$def'[ +| +].*/,/^#endif/{s/.*\/\///p; /^{ /{ s/^{ "//; s/",.*$//p;}; }' $MF)
- path=$1; shift
-
- for n in $@; do
- echo "$path/$n"
- done
+for def in ${LIST}; do
+ i=`sed -n 's/^#ifdef '$def'.*\/\/\(.*$\)/\/\1\//gp' $MF`
+ j=`sed -n '/^#ifdef '$def'.*/,/^#endif/{ s/.*\"\(.*\)\".*/\1/gp; }' $MF`
+ for k in $j; do
+ echo $i$k
done
+done
diff --git a/coreutils/df.c b/coreutils/df.c
index a0692afc5..bbda69456 100644
--- a/coreutils/df.c
+++ b/coreutils/df.c
@@ -17,7 +17,7 @@ df(const char * device, const char * mountPoint)
long blocks_percent_used;
if ( statfs(mountPoint, &s) != 0 ) {
- name_and_error(mountPoint);
+ perror(mountPoint);
return 1;
}
@@ -52,7 +52,7 @@ df(const char * device, const char * mountPoint)
}
extern int
-df_main(struct FileInfo * i, int argc, char * * argv)
+df_main(int argc, char * * argv)
{
static const char header[] =
"Filesystem 1024-blocks Used Available Capacity Mounted on\n";
@@ -63,11 +63,9 @@ df_main(struct FileInfo * i, int argc, char * * argv)
int status;
while ( argc > 1 ) {
- if ( (mountEntry = findMountPoint(argv[1], "/etc/mtab")) == 0
- && (mountEntry = findMountPoint(argv[1], "/proc/mounts")) == 0 )
+ if ( (mountEntry = findMountPoint(argv[1], "/proc/mounts")) == 0 )
{
- fprintf(stderr, "%s: can't find mount point.\n"
- ,argv[1]);
+ fprintf(stderr, "%s: can't find mount point.\n" ,argv[1]);
return 1;
}
status = df(mountEntry->mnt_fsname, mountEntry->mnt_dir);
@@ -82,10 +80,8 @@ df_main(struct FileInfo * i, int argc, char * * argv)
FILE * mountTable;
struct mntent * mountEntry;
- if ( (mountTable = setmntent("/etc/mtab", "r")) == 0
- && (mountTable = setmntent("/proc/mounts", "r")) == 0
- ) {
- name_and_error("/etc/mtab");
+ if ( (mountTable = setmntent("/proc/mounts", "r")) == 0) {
+ perror("/proc/mounts");
return 1;
}
@@ -101,3 +97,48 @@ df_main(struct FileInfo * i, int argc, char * * argv)
return 0;
}
+
+
+
+
+/*
+ * Given a block device, find the mount table entry if that block device
+ * is mounted.
+ *
+ * Given any other file (or directory), find the mount table entry for its
+ * filesystem.
+ */
+extern struct mntent *
+findMountPoint(const char * name, const char * table)
+{
+ struct stat s;
+ dev_t mountDevice;
+ FILE * mountTable;
+ struct mntent * mountEntry;
+
+ if ( stat(name, &s) != 0 )
+ return 0;
+
+ if ( (s.st_mode & S_IFMT) == S_IFBLK )
+ mountDevice = s.st_rdev;
+ else
+ mountDevice = s.st_dev;
+
+
+ if ( (mountTable = setmntent(table, "r")) == 0 )
+ return 0;
+
+ while ( (mountEntry = getmntent(mountTable)) != 0 ) {
+ if ( strcmp(name, mountEntry->mnt_dir) == 0
+ || strcmp(name, mountEntry->mnt_fsname) == 0 ) /* String match. */
+ break;
+ if ( stat(mountEntry->mnt_fsname, &s) == 0
+ && s.st_rdev == mountDevice ) /* Match the device. */
+ break;
+ if ( stat(mountEntry->mnt_dir, &s) == 0
+ && s.st_dev == mountDevice ) /* Match the directory's mount point. */
+ break;
+ }
+ endmntent(mountTable);
+ return mountEntry;
+}
diff --git a/df.c b/df.c
index a0692afc5..bbda69456 100644
--- a/df.c
+++ b/df.c
@@ -17,7 +17,7 @@ df(const char * device, const char * mountPoint)
long blocks_percent_used;
if ( statfs(mountPoint, &s) != 0 ) {
- name_and_error(mountPoint);
+ perror(mountPoint);
return 1;
}
@@ -52,7 +52,7 @@ df(const char * device, const char * mountPoint)
}
extern int
-df_main(struct FileInfo * i, int argc, char * * argv)
+df_main(int argc, char * * argv)
{
static const char header[] =
"Filesystem 1024-blocks Used Available Capacity Mounted on\n";
@@ -63,11 +63,9 @@ df_main(struct FileInfo * i, int argc, char * * argv)
int status;
while ( argc > 1 ) {
- if ( (mountEntry = findMountPoint(argv[1], "/etc/mtab")) == 0
- && (mountEntry = findMountPoint(argv[1], "/proc/mounts")) == 0 )
+ if ( (mountEntry = findMountPoint(argv[1], "/proc/mounts")) == 0 )
{
- fprintf(stderr, "%s: can't find mount point.\n"
- ,argv[1]);
+ fprintf(stderr, "%s: can't find mount point.\n" ,argv[1]);
return 1;
}
status = df(mountEntry->mnt_fsname, mountEntry->mnt_dir);
@@ -82,10 +80,8 @@ df_main(struct FileInfo * i, int argc, char * * argv)
FILE * mountTable;
struct mntent * mountEntry;
- if ( (mountTable = setmntent("/etc/mtab", "r")) == 0
- && (mountTable = setmntent("/proc/mounts", "r")) == 0
- ) {
- name_and_error("/etc/mtab");
+ if ( (mountTable = setmntent("/proc/mounts", "r")) == 0) {
+ perror("/proc/mounts");
return 1;
}
@@ -101,3 +97,48 @@ df_main(struct FileInfo * i, int argc, char * * argv)
return 0;
}
+
+
+
+
+/*
+ * Given a block device, find the mount table entry if that block device
+ * is mounted.
+ *
+ * Given any other file (or directory), find the mount table entry for its
+ * filesystem.
+ */
+extern struct mntent *
+findMountPoint(const char * name, const char * table)
+{
+ struct stat s;
+ dev_t mountDevice;
+ FILE * mountTable;
+ struct mntent * mountEntry;
+
+ if ( stat(name, &s) != 0 )
+ return 0;
+
+ if ( (s.st_mode & S_IFMT) == S_IFBLK )
+ mountDevice = s.st_rdev;
+ else
+ mountDevice = s.st_dev;
+
+
+ if ( (mountTable = setmntent(table, "r")) == 0 )
+ return 0;
+
+ while ( (mountEntry = getmntent(mountTable)) != 0 ) {
+ if ( strcmp(name, mountEntry->mnt_dir) == 0
+ || strcmp(name, mountEntry->mnt_fsname) == 0 ) /* String match. */
+ break;
+ if ( stat(mountEntry->mnt_fsname, &s) == 0
+ && s.st_rdev == mountDevice ) /* Match the device. */
+ break;
+ if ( stat(mountEntry->mnt_dir, &s) == 0
+ && s.st_dev == mountDevice ) /* Match the directory's mount point. */
+ break;
+ }
+ endmntent(mountTable);
+ return mountEntry;
+}
diff --git a/dmesg.c b/dmesg.c
index a63fa3d39..9096621b0 100644
--- a/dmesg.c
+++ b/dmesg.c
@@ -28,7 +28,7 @@ static inline _syscall3(int,klog,int,type,char *,b,int,len)
const char dmesg_usage[] = "dmesg";
int
-dmesg_main(struct FileInfo * info, int argc, char * * argv)
+dmesg_main(int argc, char * * argv)
{
char buf[4096];
@@ -50,7 +50,7 @@ dmesg_main(struct FileInfo * info, int argc, char * * argv)
break;
case '?':
default:
- usage(dmesg_usage);
+ fprintf(stderr, "%s\n", dmesg_usage);
exit(1);
}
}
@@ -58,7 +58,7 @@ dmesg_main(struct FileInfo * info, int argc, char * * argv)
argv += optind;
if (argc > 1) {
- usage(dmesg_usage);
+ fprintf(stderr, "%s\n", dmesg_usage);
exit(1);
}
diff --git a/find.c b/find.c
index b3ac1ff5a..a42f9e979 100644
--- a/find.c
+++ b/find.c
@@ -1,3 +1,133 @@
+/*
+ * Mini find implementation for busybox
+ *
+ * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <dirent.h>
+#include "internal.h"
+
+
+static char* pattern=NULL;
+static char* directory=NULL;
+int dereferenceFlag=FALSE;
+
+static const char find_usage[] = "find [path...] [expression]\n"
+"default path is the current directory; default expression is -print\n"
+"expression may consist of:\n";
+
+
+
+static int fileAction(const char *fileName)
+{
+ if (pattern==NULL)
+ fprintf(stdout, "%s\n", fileName);
+ else if (match(fileName, pattern) == TRUE)
+ fprintf(stdout, "%s\n", fileName);
+ return( TRUE);
+}
+
+static int dirAction(const char *fileName)
+{
+ DIR *dir;
+ struct dirent *entry;
+
+ if (pattern==NULL)
+ fprintf(stdout, "%s\n", fileName);
+ else if (match(fileName, pattern) == TRUE)
+ fprintf(stdout, "%s\n", fileName);
+
+ dir = opendir( fileName);
+ if (!dir) {
+ perror("Can't open directory");
+ exit(FALSE);
+ }
+ while ((entry = readdir(dir)) != NULL) {
+ char dirName[NAME_MAX];
+ sprintf(dirName, "%s/%s", fileName, entry->d_name);
+ recursiveAction( dirName, TRUE, dereferenceFlag, fileAction, dirAction);
+ }
+ return( TRUE);
+}
+
+int find_main(int argc, char **argv)
+{
+ if (argc <= 1) {
+ dirAction( ".");
+ }
+
+ /* peel off the "find" */
+ argc--;
+ argv++;
+
+ if (**argv != '-') {
+ directory=*argv;
+ argc--;
+ argv++;
+ }
+
+ /* Parse any options */
+ while (**argv == '-') {
+ int stopit=FALSE;
+ while (*++(*argv) && stopit==FALSE) switch (**argv) {
+ case 'f':
+ if (strcmp(*argv, "follow")==0) {
+ argc--;
+ argv++;
+ dereferenceFlag=TRUE;
+ }
+ break;
+ case 'n':
+ if (strcmp(*argv, "name")==0) {
+ if (argc-- > 1) {
+ pattern=*(++argv);
+ stopit=-TRUE;
+ } else {
+ fprintf(stderr, "Usage: %s\n", find_usage);
+ exit( FALSE);
+ }
+ }
+ break;
+ case '-':
+ /* Ignore all long options */
+ break;
+ default:
+ fprintf(stderr, "Usage: %s\n", find_usage);
+ exit( FALSE);
+ }
+ if (argc-- > 1)
+ argv++;
+ if (**argv != '-')
+ break;
+ else
+ break;
+ }
+
+ dirAction( directory);
+ exit(TRUE);
+}
+
+
+
+#ifdef foobar
+
#include "internal.h"
#include <errno.h>
#include <stdio.h>
@@ -21,3 +151,6 @@ find_fn(const struct FileInfo * i)
return(0);
}
+
+
+#endif
diff --git a/findutils/find.c b/findutils/find.c
index b3ac1ff5a..a42f9e979 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -1,3 +1,133 @@
+/*
+ * Mini find implementation for busybox
+ *
+ * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <dirent.h>
+#include "internal.h"
+
+
+static char* pattern=NULL;
+static char* directory=NULL;
+int dereferenceFlag=FALSE;
+
+static const char find_usage[] = "find [path...] [expression]\n"
+"default path is the current directory; default expression is -print\n"
+"expression may consist of:\n";
+
+
+
+static int fileAction(const char *fileName)
+{
+ if (pattern==NULL)
+ fprintf(stdout, "%s\n", fileName);
+ else if (match(fileName, pattern) == TRUE)
+ fprintf(stdout, "%s\n", fileName);
+ return( TRUE);
+}
+
+static int dirAction(const char *fileName)
+{
+ DIR *dir;
+ struct dirent *entry;
+
+ if (pattern==NULL)
+ fprintf(stdout, "%s\n", fileName);
+ else if (match(fileName, pattern) == TRUE)
+ fprintf(stdout, "%s\n", fileName);
+
+ dir = opendir( fileName);
+ if (!dir) {
+ perror("Can't open directory");
+ exit(FALSE);
+ }
+ while ((entry = readdir(dir)) != NULL) {
+ char dirName[NAME_MAX];
+ sprintf(dirName, "%s/%s", fileName, entry->d_name);
+ recursiveAction( dirName, TRUE, dereferenceFlag, fileAction, dirAction);
+ }
+ return( TRUE);
+}
+
+int find_main(int argc, char **argv)
+{
+ if (argc <= 1) {
+ dirAction( ".");
+ }
+
+ /* peel off the "find" */
+ argc--;
+ argv++;
+
+ if (**argv != '-') {
+ directory=*argv;
+ argc--;
+ argv++;
+ }
+
+ /* Parse any options */
+ while (**argv == '-') {
+ int stopit=FALSE;
+ while (*++(*argv) && stopit==FALSE) switch (**argv) {
+ case 'f':
+ if (strcmp(*argv, "follow")==0) {
+ argc--;
+ argv++;
+ dereferenceFlag=TRUE;
+ }
+ break;
+ case 'n':
+ if (strcmp(*argv, "name")==0) {
+ if (argc-- > 1) {
+ pattern=*(++argv);
+ stopit=-TRUE;
+ } else {
+ fprintf(stderr, "Usage: %s\n", find_usage);
+ exit( FALSE);
+ }
+ }
+ break;
+ case '-':
+ /* Ignore all long options */
+ break;
+ default:
+ fprintf(stderr, "Usage: %s\n", find_usage);
+ exit( FALSE);
+ }
+ if (argc-- > 1)
+ argv++;
+ if (**argv != '-')
+ break;
+ else
+ break;
+ }
+
+ dirAction( directory);
+ exit(TRUE);
+}
+
+
+
+#ifdef foobar
+
#include "internal.h"
#include <errno.h>
#include <stdio.h>
@@ -21,3 +151,6 @@ find_fn(const struct FileInfo * i)
return(0);
}
+
+
+#endif
diff --git a/findutils/grep.c b/findutils/grep.c
index 3779e5510..a07feda03 100644
--- a/findutils/grep.c
+++ b/findutils/grep.c
@@ -36,7 +36,7 @@ static BOOL search
extern int
-grep_main(struct FileInfo * unused, int argc, char ** argv)
+grep_main(int argc, char ** argv)
{
FILE * fp;
const char * word;
diff --git a/grep.c b/grep.c
index 3779e5510..a07feda03 100644
--- a/grep.c
+++ b/grep.c
@@ -36,7 +36,7 @@ static BOOL search
extern int
-grep_main(struct FileInfo * unused, int argc, char ** argv)
+grep_main(int argc, char ** argv)
{
FILE * fp;
const char * word;
diff --git a/gzip.c b/gzip.c
index 6fd2e3971..4b1d32ddd 100644
--- a/gzip.c
+++ b/gzip.c
@@ -380,7 +380,7 @@ extern int block_mode; /* block compress mode -C compatible with 2.0 */
# undef LZW
#endif
-/* $Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $ */
+/* $Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $ */
/* tailor.h -- target dependent definitions
* Copyright (C) 1992-1993 Jean-loup Gailly.
* This is free software; you can redistribute it and/or modify it under the
@@ -391,7 +391,7 @@ extern int block_mode; /* block compress mode -C compatible with 2.0 */
* The target dependent functions should be defined in tailor.c.
*/
-/* $Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $ */
+/* $Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $ */
#if defined(__MSDOS__) && !defined(MSDOS)
# define MSDOS
@@ -767,7 +767,7 @@ extern int block_mode; /* block compress mode -C compatible with 2.0 */
#endif
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* ===========================================================================
@@ -976,7 +976,7 @@ void copy_block(buf, len, header)
#include <stdio.h>
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* ===========================================================================
@@ -1592,7 +1592,7 @@ ulg deflate()
*/
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
@@ -1781,7 +1781,7 @@ static int (*work) OF((int infile, int outfile)) = zip; /* function to call */
// int main (argc, argv)
// int argc;
// char **argv;
-int gzip_main(struct FileInfo * i, int argc, char * * argv)
+int gzip_main(int argc, char * * argv)
{
foreground = signal(SIGINT, SIG_IGN) != SIG_IGN;
if (foreground) {
@@ -1925,7 +1925,7 @@ local void do_exit(int exitcode)
#include <ctype.h>
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* ===========================================================================
@@ -2943,7 +2943,7 @@ local void set_file_type()
*/
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
@@ -3142,7 +3142,7 @@ void display_ratio(num, den, file)
*/
#ifdef RCSID
-static char rcsid[] = "$Id: gzip.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: gzip.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
diff --git a/internal.h b/internal.h
index 5a8b0c57e..9c7dda4d4 100644
--- a/internal.h
+++ b/internal.h
@@ -183,6 +183,8 @@ int fullRead(int fd, char *buf, int len);
int recursiveAction(const char *fileName, BOOL recurse, BOOL followLinks,
int (*fileAction) (const char *fileName),
int (*dirAction) (const char *fileName));
+BOOL match(const char* text, const char * pattern);
+const char* timeString(time_t timeVal);
#endif
diff --git a/tar.c b/tar.c
index 03da96735..498d4a300 100644
--- a/tar.c
+++ b/tar.c
@@ -131,14 +131,10 @@ static void writeHeader(const char * fileName,
static void writeTarFile(int fileCount, char ** fileTable);
static void writeTarBlock(const char * buf, int len);
static BOOL putOctal(char * cp, int len, long value);
-extern const char * modeString(int mode);
-extern const char * timeString(time_t timeVal);
-extern int fullWrite(int fd, const char * buf, int len);
-extern int fullRead(int fd, char * buf, int len);
extern int
-tar_main(struct FileInfo *unused, int argc, char ** argv)
+tar_main(int argc, char ** argv)
{
const char * options;
@@ -1258,167 +1254,6 @@ wantFileName(const char * fileName, int fileCount, char ** fileTable)
-/*
- * Return the standard ls-like mode string from a file mode.
- * This is static and so is overwritten on each call.
- */
-const char *
-modeString(int mode)
-{
- static char buf[12];
-
- strcpy(buf, "----------");
-
- /*
- * Fill in the file type.
- */
- if (S_ISDIR(mode))
- buf[0] = 'd';
- if (S_ISCHR(mode))
- buf[0] = 'c';
- if (S_ISBLK(mode))
- buf[0] = 'b';
- if (S_ISFIFO(mode))
- buf[0] = 'p';
-#ifdef S_ISLNK
- if (S_ISLNK(mode))
- buf[0] = 'l';
-#endif
-#ifdef S_ISSOCK
- if (S_ISSOCK(mode))
- buf[0] = 's';
-#endif
-
- /*
- * Now fill in the normal file permissions.
- */
- if (mode & S_IRUSR)
- buf[1] = 'r';
- if (mode & S_IWUSR)
- buf[2] = 'w';
- if (mode & S_IXUSR)
- buf[3] = 'x';
- if (mode & S_IRGRP)
- buf[4] = 'r';
- if (mode & S_IWGRP)
- buf[5] = 'w';
- if (mode & S_IXGRP)
- buf[6] = 'x';
- if (mode & S_IROTH)
- buf[7] = 'r';
- if (mode & S_IWOTH)
- buf[8] = 'w';
- if (mode & S_IXOTH)
- buf[9] = 'x';
-
- /*
- * Finally fill in magic stuff like suid and sticky text.
- */
- if (mode & S_ISUID)
- buf[3] = ((mode & S_IXUSR) ? 's' : 'S');
- if (mode & S_ISGID)
- buf[6] = ((mode & S_IXGRP) ? 's' : 'S');
- if (mode & S_ISVTX)
- buf[9] = ((mode & S_IXOTH) ? 't' : 'T');
-
- return buf;
-}
-
-
-/*
- * Get the time string to be used for a file.
- * This is down to the minute for new files, but only the date for old files.
- * The string is returned from a static buffer, and so is overwritten for
- * each call.
- */
-const char *
-timeString(time_t timeVal)
-{
- time_t now;
- char * str;
- static char buf[26];
-
- time(&now);
-
- str = ctime(&timeVal);
-
- strcpy(buf, &str[4]);
- buf[12] = '\0';
-
- if ((timeVal > now) || (timeVal < now - 365*24*60*60L))
- {
- strcpy(&buf[7], &str[20]);
- buf[11] = '\0';
- }
-
- return buf;
-}
-
-
-
-/*
- * Write all of the supplied buffer out to a file.
- * This does multiple writes as necessary.
- * Returns the amount written, or -1 on an error.
- */
-int
-fullWrite(int fd, const char * buf, int len)
-{
- int cc;
- int total;
-
- total = 0;
-
- while (len > 0)
- {
- cc = write(fd, buf, len);
-
- if (cc < 0)
- return -1;
-
- buf += cc;
- total+= cc;
- len -= cc;
- }
-
- return total;
-}
-
-
-/*
- * Read all of the supplied buffer from a file.
- * This does multiple reads as necessary.
- * Returns the amount read, or -1 on an error.
- * A short read is returned on an end of file.
- */
-int
-fullRead(int fd, char * buf, int len)
-{
- int cc;
- int total;
-
- total = 0;
-
- while (len > 0)
- {
- cc = read(fd, buf, len);
-
- if (cc < 0)
- return -1;
-
- if (cc == 0)
- break;
-
- buf += cc;
- total+= cc;
- len -= cc;
- }
-
- return total;
-}
-
-
-
#endif
/* END CODE */
diff --git a/util-linux/dmesg.c b/util-linux/dmesg.c
index a63fa3d39..9096621b0 100644
--- a/util-linux/dmesg.c
+++ b/util-linux/dmesg.c
@@ -28,7 +28,7 @@ static inline _syscall3(int,klog,int,type,char *,b,int,len)
const char dmesg_usage[] = "dmesg";
int
-dmesg_main(struct FileInfo * info, int argc, char * * argv)
+dmesg_main(int argc, char * * argv)
{
char buf[4096];
@@ -50,7 +50,7 @@ dmesg_main(struct FileInfo * info, int argc, char * * argv)
break;
case '?':
default:
- usage(dmesg_usage);
+ fprintf(stderr, "%s\n", dmesg_usage);
exit(1);
}
}
@@ -58,7 +58,7 @@ dmesg_main(struct FileInfo * info, int argc, char * * argv)
argv += optind;
if (argc > 1) {
- usage(dmesg_usage);
+ fprintf(stderr, "%s\n", dmesg_usage);
exit(1);
}
diff --git a/utility.c b/utility.c
index c8f58e8f2..369aa21f2 100644
--- a/utility.c
+++ b/utility.c
@@ -406,6 +406,131 @@ freeChunks(void)
/*
+ * Get the time string to be used for a file.
+ * This is down to the minute for new files, but only the date for old files.
+ * The string is returned from a static buffer, and so is overwritten for
+ * each call.
+ */
+const char *
+timeString(time_t timeVal)
+{
+ time_t now;
+ char * str;
+ static char buf[26];
+
+ time(&now);
+
+ str = ctime(&timeVal);
+
+ strcpy(buf, &str[4]);
+ buf[12] = '\0';
+
+ if ((timeVal > now) || (timeVal < now - 365*24*60*60L))
+ {
+ strcpy(&buf[7], &str[20]);
+ buf[11] = '\0';
+ }
+
+ return buf;
+}
+
+
+/*
+ * Routine to see if a text string is matched by a wildcard pattern.
+ * Returns TRUE if the text is matched, or FALSE if it is not matched
+ * or if the pattern is invalid.
+ * * matches zero or more characters
+ * ? matches a single character
+ * [abc] matches 'a', 'b' or 'c'
+ * \c quotes character c
+ * Adapted from code written by Ingo Wilken.
+ */
+BOOL
+match(const char * text, const char * pattern)
+{
+ const char * retryPat;
+ const char * retryText;
+ int ch;
+ BOOL found;
+
+ retryPat = NULL;
+ retryText = NULL;
+
+ while (*text || *pattern)
+ {
+ ch = *pattern++;
+
+ switch (ch)
+ {
+ case '*':
+ retryPat = pattern;
+ retryText = text;
+ break;
+
+ case '[':
+ found = FALSE;
+
+ while ((ch = *pattern++) != ']')
+ {
+ if (ch == '\\')
+ ch = *pattern++;
+
+ if (ch == '\0')
+ return FALSE;
+
+ if (*text == ch)
+ found = TRUE;
+ }
+
+ if (!found)
+ {
+ pattern = retryPat;
+ text = ++retryText;
+ }
+
+ /* fall into next case */
+
+ case '?':
+ if (*text++ == '\0')
+ return FALSE;
+
+ break;
+
+ case '\\':
+ ch = *pattern++;
+
+ if (ch == '\0')
+ return FALSE;
+
+ /* fall into next case */
+
+ default:
+ if (*text == ch)
+ {
+ if (*text)
+ text++;
+ break;
+ }
+
+ if (*text)
+ {
+ pattern = retryPat;
+ text = ++retryText;
+ break;
+ }
+
+ return FALSE;
+ }
+
+ if (pattern == NULL)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+/*
* Write all of the supplied buffer out to a file.
* This does multiple writes as necessary.
* Returns the amount written, or -1 on an error.
@@ -543,3 +668,14 @@ recursiveAction( const char *fileName, BOOL recurse, BOOL followLinks,
/* END CODE */
+
+
+
+
+
+
+
+
+
+
+
diff --git a/zcat.c b/zcat.c
index 50fcdfc47..dfc4d21da 100644
--- a/zcat.c
+++ b/zcat.c
@@ -59,7 +59,7 @@ static char *license_msg[] = {
*/
#ifdef RCSID
-static char rcsid[] = "$Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: zcat.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
@@ -80,7 +80,7 @@ static char rcsid[] = "$Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
* The target dependent functions should be defined in tailor.c.
*/
-/* $Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $ */
+/* $Id: zcat.c,v 1.2 1999/10/06 20:25:32 andersen Exp $ */
#define RECORD_IO 0
@@ -436,7 +436,7 @@ extern int unlzw OF((int in, int out));
# undef LZW
#endif
-/* $Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $ */
+/* $Id: zcat.c,v 1.2 1999/10/06 20:25:32 andersen Exp $ */
/* #include "getopt.h" */
@@ -698,7 +698,7 @@ int (*work) OF((int infile, int outfile)) = unzip; /* function to call */
#define strequ(s1, s2) (strcmp((s1),(s2)) == 0)
/* ======================================================================== */
-int zcat_main (struct FileInfo * i, int argc, char * * argv)
+int zcat_main (int argc, char * * argv)
{
int file_count; /* number of files to precess */
@@ -895,7 +895,7 @@ RETSIGTYPE abort_gzip()
*/
#ifdef RCSID
-static char rcsid[] = "$Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: zcat.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
/* #include "crypt.h" */
@@ -1021,7 +1021,7 @@ int unzip(in, out)
*/
#ifdef RCSID
-static char rcsid[] = "$Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: zcat.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <ctype.h>
@@ -1408,7 +1408,7 @@ ulg crc_32_tab[] = {
*/
#ifdef RCSID
-static char rcsid[] = "$Id: zcat.c,v 1.1 1999/10/05 16:24:56 andersen Exp $";
+static char rcsid[] = "$Id: zcat.c,v 1.2 1999/10/06 20:25:32 andersen Exp $";
#endif
#include <sys/types.h>