This commit is contained in:
Eric Andersen 1999-11-09 01:47:36 +00:00
parent fbb39c83b6
commit 50d6360771
19 changed files with 331 additions and 305 deletions

View File

@ -5,6 +5,17 @@
better job of finding the real consol device rather than using better job of finding the real consol device rather than using
/dev/console which doesn't support job control. Patch also /dev/console which doesn't support job control. Patch also
thanks to Eric Delaunay. thanks to Eric Delaunay.
* more started to read from stdin after the last file was finished, and
options were not parsed correctly (fix thanks to Eric Delaunay).
* rm wouldn't remove a symlink unless the symlink was valid. This was
a side effect of the busybox 0.32 recursiveAction() fix. Things
should now work correctly.
* grep wouldn't grep stdin. Now it does.
* sed wouldn't sed stdin. Now it does.
* sed was appending a \n to the end of lines with replacements.
Now it doesn't do that.
* ls -l now bypasses libc6 nss when displaying user/group names.
Now uses my_getpwuid and my_getgrgid.
0.33 0.33
* Fixed a bug where init could hang instead of rebooting. * Fixed a bug where init could hang instead of rebooting.

View File

@ -22,7 +22,7 @@ BUILDTIME=$(shell date "+%Y%m%d-%H%M")
# Comment out the following to make a debuggable build # Comment out the following to make a debuggable build
# Leave this off for production use. # Leave this off for production use.
DODEBUG=false DODEBUG=true
# If you want a static binary, turn this on. I can't think # If you want a static binary, turn this on. I can't think
# of many situations where anybody would ever want it static, # of many situations where anybody would ever want it static,
# but... # but...

View File

@ -35,6 +35,16 @@
#include <signal.h> #include <signal.h>
#include <time.h> #include <time.h>
/* Note that tar.c expects TRUE and FALSE to be defined
* exactly the opposite of how they are used everywhere else.
* Some time this should be integrated a bit better, but this
* does the job for now.
*/
#undef FALSE
#undef TRUE
#define FALSE ((int) 0)
#define TRUE ((int) 1)
static const char tar_usage[] = static const char tar_usage[] =
"tar -[cxtvOf] [tarFileName] [FILE] ...\n" "tar -[cxtvOf] [tarFileName] [FILE] ...\n"
@ -169,10 +179,9 @@ extern int tar_main (int argc, char **argv)
/* /*
* Parse the options. * Parse the options.
*/ */
options = *argv++;
argc--;
if (**argv == '-') { if (**argv == '-') {
options = (*argv++) + 1;
argc--;
for (; *options; options++) { for (; *options; options++) {
switch (*options) { switch (*options) {
case 'f': case 'f':

View File

@ -54,7 +54,7 @@
#define BB_SYNC #define BB_SYNC
#define BB_TAR #define BB_TAR
#define BB_TOUCH #define BB_TOUCH
//#define BB_TRUE_FALSE // Supplied by ash //#define BB_TRUE_FALSE
#define BB_UMOUNT #define BB_UMOUNT
#define BB_UPDATE #define BB_UPDATE
#define BB_UNAME #define BB_UNAME

View File

@ -40,7 +40,7 @@
* 1. requires lstat (BSD) - how do you do it without? * 1. requires lstat (BSD) - how do you do it without?
*/ */
//#define FEATURE_USERNAME /* show username/groupnames (libc6 uses NSS) */ #define FEATURE_USERNAME /* show username/groupnames (bypasses libc6 NSS) */
#define FEATURE_TIMESTAMPS /* show file timestamps */ #define FEATURE_TIMESTAMPS /* show file timestamps */
#define FEATURE_AUTOWIDTH /* calculate terminal & column widths */ #define FEATURE_AUTOWIDTH /* calculate terminal & column widths */
#define FEATURE_FILETYPECHAR /* enable -p and -F */ #define FEATURE_FILETYPECHAR /* enable -p and -F */
@ -64,10 +64,6 @@
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#ifdef FEATURE_USERNAME
#include <pwd.h>
#include <grp.h>
#endif
#ifdef FEATURE_TIMESTAMPS #ifdef FEATURE_TIMESTAMPS
#include <time.h> #include <time.h>
#endif #endif
@ -83,27 +79,6 @@
#define MINOR(dev) ((dev)&0xff) #define MINOR(dev) ((dev)&0xff)
#endif #endif
#define MODE1 "rwxrwxrwx"
#define MODE0 "---------"
#define SMODE1 "..s..s..t"
#define SMODE0 "..S..S..T"
/* The 9 mode bits to test */
static const mode_t MBIT[] = {
S_IRUSR, S_IWUSR, S_IXUSR,
S_IRGRP, S_IWGRP, S_IXGRP,
S_IROTH, S_IWOTH, S_IXOTH
};
/* The special bits. If set, display SMODE0/1 instead of MODE0/1 */
static const mode_t SBIT[] = {
0, 0, S_ISUID,
0, 0, S_ISGID,
0, 0, S_ISVTX
};
#define FMT_AUTO 0 #define FMT_AUTO 0
#define FMT_LONG 1 /* one record per line, extended info */ #define FMT_LONG 1 /* one record per line, extended info */
#define FMT_SINGLE 2 /* one record per line */ #define FMT_SINGLE 2 /* one record per line */
@ -216,45 +191,35 @@ static void list_single(const char *name, struct stat *info, const char *fullnam
if (display_fmt == FMT_LONG) { if (display_fmt == FMT_LONG) {
mode_t mode = info->st_mode; mode_t mode = info->st_mode;
int i;
scratch[0] = TYPECHAR(mode);
for (i=0; i<9; i++)
if (mode & SBIT[i])
scratch[i+1] = (mode & MBIT[i])
? SMODE1[i]
: SMODE0[i];
else
scratch[i+1] = (mode & MBIT[i])
? MODE1[i]
: MODE0[i];
newline(); newline();
wr(scratch, 10); wr(modeString(mode), 10);
column=10; column=10;
writenum((long)info->st_nlink,(short)4); writenum((long)info->st_nlink,(short)5);
fputs(" ", stdout); fputs(" ", stdout);
#ifdef FEATURE_USERNAME #ifdef FEATURE_USERNAME
if (!(opts & DISP_NUMERIC)) { if (!(opts & DISP_NUMERIC)) {
struct passwd *pw = getpwuid(info->st_uid); scratch[8]='\0';
if (pw) my_getpwuid( scratch, info->st_uid);
fputs(pw->pw_name, stdout); if (*scratch)
fputs(scratch, stdout);
else else
writenum((long)info->st_uid,(short)0); writenum((long)info->st_uid,(short)0);
} else } else
#endif #endif
writenum((long)info->st_uid,(short)0); writenum((long)info->st_uid,(short)0);
tab(24); tab(16);
#ifdef FEATURE_USERNAME #ifdef FEATURE_USERNAME
if (!(opts & DISP_NUMERIC)) { if (!(opts & DISP_NUMERIC)) {
struct group *gr = getgrgid(info->st_gid); scratch[8]='\0';
if (gr) my_getgrgid( scratch, info->st_gid);
fputs(gr->gr_name, stdout); if (*scratch)
fputs(scratch, stdout);
else else
writenum((long)info->st_gid,(short)0); writenum((long)info->st_gid,(short)0);
} else } else
#endif #endif
writenum((long)info->st_gid,(short)0); writenum((long)info->st_gid,(short)0);
tab(33); tab(17);
if (S_ISBLK(mode) || S_ISCHR(mode)) { if (S_ISBLK(mode) || S_ISCHR(mode)) {
writenum((long)MAJOR(info->st_rdev),(short)3); writenum((long)MAJOR(info->st_rdev),(short)3);
fputs(", ", stdout); fputs(", ", stdout);

View File

@ -84,7 +84,7 @@ extern int rm_main(int argc, char **argv)
while (argc-- > 0) { while (argc-- > 0) {
srcName = *(argv++); srcName = *(argv++);
if (recursiveAction( srcName, recursiveFlag, TRUE, TRUE, if (recursiveAction( srcName, recursiveFlag, FALSE, TRUE,
fileAction, dirAction) == FALSE) { fileAction, dirAction) == FALSE) {
exit( FALSE); exit( FALSE);
} }

View File

@ -45,9 +45,23 @@ static const char sed_usage[] =
#else #else
"This version of sed matches strings (not full regexps).\n"; "This version of sed matches strings (not full regexps).\n";
#endif #endif
static void do_sed(FILE *fp, char *needle, char *newNeedle, int ignoreCase, int printFlag, int quietFlag)
{
int foundOne=FALSE;
char haystack[1024];
while (fgets (haystack, 1023, fp)) {
foundOne = replace_match(haystack, needle, newNeedle, ignoreCase);
if (foundOne==TRUE && printFlag==TRUE) {
fprintf(stdout, haystack);
}
if (quietFlag==FALSE) {
fprintf(stdout, haystack);
}
}
}
extern int sed_main (int argc, char **argv) extern int sed_main (int argc, char **argv)
{ {
@ -56,11 +70,9 @@ extern int sed_main (int argc, char **argv)
char *name; char *name;
char *cp; char *cp;
int ignoreCase=FALSE; int ignoreCase=FALSE;
int foundOne=FALSE;
int printFlag=FALSE; int printFlag=FALSE;
int quietFlag=FALSE; int quietFlag=FALSE;
int stopNow; int stopNow;
char *haystack;
argc--; argc--;
argv++; argv++;
@ -73,24 +85,23 @@ extern int sed_main (int argc, char **argv)
cp = *argv++; cp = *argv++;
stopNow=FALSE; stopNow=FALSE;
while (*++cp && stopNow==FALSE) while (*++cp && stopNow==FALSE) {
switch (*cp) { switch (*cp) {
case 'n': case 'n':
quietFlag = TRUE; quietFlag = TRUE;
break; break;
case 'e': case 'e':
if (*(cp+1)==0 && --argc < 0) { if (*(cp+1)==0 && --argc < 0) {
fprintf(stderr, "A\n");
usage( sed_usage); usage( sed_usage);
} }
cp = *argv++; if ( *++cp != 's')
cp = *argv++;
while( *cp ) { while( *cp ) {
if (*cp == 's' && strlen(cp) > 3 && *(cp+1) == '/') { if (*cp == 's' && strlen(cp) > 3 && *(cp+1) == '/') {
char* pos=needle=cp+2; char* pos=needle=cp+2;
for(;;) { for(;;) {
pos = strchr(pos, '/'); pos = strchr(pos, '/');
if (pos==NULL) { if (pos==NULL) {
fprintf(stderr, "B\n");
usage( sed_usage); usage( sed_usage);
} }
if (*(pos-1) == '\\') { if (*(pos-1) == '\\') {
@ -104,7 +115,6 @@ extern int sed_main (int argc, char **argv)
for(;;) { for(;;) {
pos = strchr(pos, '/'); pos = strchr(pos, '/');
if (pos==NULL) { if (pos==NULL) {
fprintf(stderr, "C\n");
usage( sed_usage); usage( sed_usage);
} }
if (*(pos-1) == '\\') { if (*(pos-1) == '\\') {
@ -116,7 +126,6 @@ extern int sed_main (int argc, char **argv)
*pos=0; *pos=0;
if (pos+2 != 0) { if (pos+2 != 0) {
while (*++pos) { while (*++pos) {
fprintf(stderr, "pos='%s'\n", pos);
switch (*pos) { switch (*pos) {
case 'i': case 'i':
ignoreCase=TRUE; ignoreCase=TRUE;
@ -134,42 +143,35 @@ extern int sed_main (int argc, char **argv)
} }
cp++; cp++;
} }
fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); //fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle);
stopNow=TRUE; stopNow=TRUE;
break; break;
default: default:
fprintf(stderr, "D\n");
usage(sed_usage); usage(sed_usage);
} }
}
} }
while (argc-- > 0) { if (argc==0) {
name = *argv++; do_sed( stdin, needle, newNeedle, ignoreCase, printFlag, quietFlag);
} else {
while (argc-- > 0) {
name = *argv++;
fp = fopen (name, "r"); fp = fopen (name, "r");
if (fp == NULL) { if (fp == NULL) {
perror (name); perror (name);
continue; continue;
}
do_sed( fp, needle, newNeedle, ignoreCase, printFlag, quietFlag);
if (ferror (fp))
perror (name);
fclose (fp);
} }
haystack = (char*)malloc( 1024);
while (fgets (haystack, 1023, fp)) {
foundOne = replace_match(haystack, needle, newNeedle, ignoreCase);
if (foundOne==TRUE && printFlag==TRUE)
fputs (haystack, stdout);
if (quietFlag==FALSE)
fputs (haystack, stdout);
/* Avoid any mem leaks */
free(haystack);
haystack = (char*)malloc( BUF_SIZE);
}
if (ferror (fp))
perror (name);
fclose (fp);
} }
exit( TRUE); exit( TRUE);
} }

View File

@ -40,45 +40,46 @@ static const char grep_usage[] =
#if defined BB_REGEXP #if defined BB_REGEXP
"This version of grep matches full regexps.\n"; "This version of grep matches full regexps.\n";
#else #else
"This version of grep matches strings (not full regexps).\n"; "This version of grep matches strings (not regexps).\n";
#endif #endif
int tellName=TRUE;
int ignoreCase=FALSE;
int tellLine=FALSE;
static do_grep(char* needle, char* haystack ) static void do_grep(FILE *fp, char* needle, char *fileName, int tellName, int ignoreCase, int tellLine)
{ {
line = 0; char *cp;
long line = 0;
char haystack[BUF_SIZE];
while (fgets (haystack, sizeof (haystack), fp)) { while (fgets (haystack, sizeof (haystack), fp)) {
line++; line++;
cp = &haystack[strlen (haystack) - 1]; cp = &haystack[strlen (haystack) - 1];
if (*cp != '\n') if (*cp != '\n')
fprintf (stderr, "%s: Line too long\n", name); fprintf (stderr, "%s: Line too long\n", fileName);
if (find_match(haystack, needle, ignoreCase) == TRUE) { if (find_match(haystack, needle, ignoreCase) == TRUE) {
if (tellName==TRUE) if (tellName==TRUE)
printf ("%s: ", name); printf ("%s:", fileName);
if (tellLine==TRUE) if (tellLine==TRUE)
printf ("%ld: ", line); printf ("%ld:", line);
fputs (haystack, stdout); fputs (haystack, stdout);
}
} }
}
} }
extern int grep_main (int argc, char **argv) extern int grep_main (int argc, char **argv)
{ {
FILE *fp; FILE *fp;
char *needle;
char *name;
char *cp; char *cp;
long line; char *needle;
char haystack[BUF_SIZE]; char *fileName;
int tellName=FALSE;
int ignoreCase=FALSE;
int tellLine=FALSE;
ignoreCase = FALSE; ignoreCase = FALSE;
tellLine = FALSE; tellLine = FALSE;
@ -100,7 +101,7 @@ extern int grep_main (int argc, char **argv)
break; break;
case 'h': case 'h':
tellName = FALSE; tellName = TRUE;
break; break;
case 'n': case 'n':
@ -115,28 +116,24 @@ extern int grep_main (int argc, char **argv)
needle = *argv++; needle = *argv++;
argc--; argc--;
if (argc==0) {
do_grep( stdin, needle, "stdin", FALSE, ignoreCase, tellLine);
} else {
while (argc-- > 0) {
fileName = *argv++;
while (argc-- > 0) { fp = fopen (fileName, "r");
if (fp == NULL) {
perror (fileName);
continue;
}
if (argc==0) { do_grep( fp, needle, fileName, tellName, ignoreCase, tellLine);
file = stdin;
if (ferror (fp))
perror (fileName);
fclose (fp);
} }
else
file = fopen(*argv, "r");
name = *argv++;
fp = fopen (name, "r");
if (fp == NULL) {
perror (name);
continue;
}
if (ferror (fp))
perror (name);
fclose (fp);
} }
exit( TRUE); exit( TRUE);
} }

81
grep.c
View File

@ -40,45 +40,46 @@ static const char grep_usage[] =
#if defined BB_REGEXP #if defined BB_REGEXP
"This version of grep matches full regexps.\n"; "This version of grep matches full regexps.\n";
#else #else
"This version of grep matches strings (not full regexps).\n"; "This version of grep matches strings (not regexps).\n";
#endif #endif
int tellName=TRUE;
int ignoreCase=FALSE;
int tellLine=FALSE;
static do_grep(char* needle, char* haystack ) static void do_grep(FILE *fp, char* needle, char *fileName, int tellName, int ignoreCase, int tellLine)
{ {
line = 0; char *cp;
long line = 0;
char haystack[BUF_SIZE];
while (fgets (haystack, sizeof (haystack), fp)) { while (fgets (haystack, sizeof (haystack), fp)) {
line++; line++;
cp = &haystack[strlen (haystack) - 1]; cp = &haystack[strlen (haystack) - 1];
if (*cp != '\n') if (*cp != '\n')
fprintf (stderr, "%s: Line too long\n", name); fprintf (stderr, "%s: Line too long\n", fileName);
if (find_match(haystack, needle, ignoreCase) == TRUE) { if (find_match(haystack, needle, ignoreCase) == TRUE) {
if (tellName==TRUE) if (tellName==TRUE)
printf ("%s: ", name); printf ("%s:", fileName);
if (tellLine==TRUE) if (tellLine==TRUE)
printf ("%ld: ", line); printf ("%ld:", line);
fputs (haystack, stdout); fputs (haystack, stdout);
}
} }
}
} }
extern int grep_main (int argc, char **argv) extern int grep_main (int argc, char **argv)
{ {
FILE *fp; FILE *fp;
char *needle;
char *name;
char *cp; char *cp;
long line; char *needle;
char haystack[BUF_SIZE]; char *fileName;
int tellName=FALSE;
int ignoreCase=FALSE;
int tellLine=FALSE;
ignoreCase = FALSE; ignoreCase = FALSE;
tellLine = FALSE; tellLine = FALSE;
@ -100,7 +101,7 @@ extern int grep_main (int argc, char **argv)
break; break;
case 'h': case 'h':
tellName = FALSE; tellName = TRUE;
break; break;
case 'n': case 'n':
@ -115,28 +116,24 @@ extern int grep_main (int argc, char **argv)
needle = *argv++; needle = *argv++;
argc--; argc--;
if (argc==0) {
do_grep( stdin, needle, "stdin", FALSE, ignoreCase, tellLine);
} else {
while (argc-- > 0) {
fileName = *argv++;
while (argc-- > 0) { fp = fopen (fileName, "r");
if (fp == NULL) {
perror (fileName);
continue;
}
if (argc==0) { do_grep( fp, needle, fileName, tellName, ignoreCase, tellLine);
file = stdin;
if (ferror (fp))
perror (fileName);
fclose (fp);
} }
else
file = fopen(*argv, "r");
name = *argv++;
fp = fopen (name, "r");
if (fp == NULL) {
perror (name);
continue;
}
if (ferror (fp))
perror (name);
fclose (fp);
} }
exit( TRUE); exit( TRUE);
} }

61
ls.c
View File

@ -40,7 +40,7 @@
* 1. requires lstat (BSD) - how do you do it without? * 1. requires lstat (BSD) - how do you do it without?
*/ */
//#define FEATURE_USERNAME /* show username/groupnames (libc6 uses NSS) */ #define FEATURE_USERNAME /* show username/groupnames (bypasses libc6 NSS) */
#define FEATURE_TIMESTAMPS /* show file timestamps */ #define FEATURE_TIMESTAMPS /* show file timestamps */
#define FEATURE_AUTOWIDTH /* calculate terminal & column widths */ #define FEATURE_AUTOWIDTH /* calculate terminal & column widths */
#define FEATURE_FILETYPECHAR /* enable -p and -F */ #define FEATURE_FILETYPECHAR /* enable -p and -F */
@ -64,10 +64,6 @@
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
#ifdef FEATURE_USERNAME
#include <pwd.h>
#include <grp.h>
#endif
#ifdef FEATURE_TIMESTAMPS #ifdef FEATURE_TIMESTAMPS
#include <time.h> #include <time.h>
#endif #endif
@ -83,27 +79,6 @@
#define MINOR(dev) ((dev)&0xff) #define MINOR(dev) ((dev)&0xff)
#endif #endif
#define MODE1 "rwxrwxrwx"
#define MODE0 "---------"
#define SMODE1 "..s..s..t"
#define SMODE0 "..S..S..T"
/* The 9 mode bits to test */
static const mode_t MBIT[] = {
S_IRUSR, S_IWUSR, S_IXUSR,
S_IRGRP, S_IWGRP, S_IXGRP,
S_IROTH, S_IWOTH, S_IXOTH
};
/* The special bits. If set, display SMODE0/1 instead of MODE0/1 */
static const mode_t SBIT[] = {
0, 0, S_ISUID,
0, 0, S_ISGID,
0, 0, S_ISVTX
};
#define FMT_AUTO 0 #define FMT_AUTO 0
#define FMT_LONG 1 /* one record per line, extended info */ #define FMT_LONG 1 /* one record per line, extended info */
#define FMT_SINGLE 2 /* one record per line */ #define FMT_SINGLE 2 /* one record per line */
@ -216,45 +191,35 @@ static void list_single(const char *name, struct stat *info, const char *fullnam
if (display_fmt == FMT_LONG) { if (display_fmt == FMT_LONG) {
mode_t mode = info->st_mode; mode_t mode = info->st_mode;
int i;
scratch[0] = TYPECHAR(mode);
for (i=0; i<9; i++)
if (mode & SBIT[i])
scratch[i+1] = (mode & MBIT[i])
? SMODE1[i]
: SMODE0[i];
else
scratch[i+1] = (mode & MBIT[i])
? MODE1[i]
: MODE0[i];
newline(); newline();
wr(scratch, 10); wr(modeString(mode), 10);
column=10; column=10;
writenum((long)info->st_nlink,(short)4); writenum((long)info->st_nlink,(short)5);
fputs(" ", stdout); fputs(" ", stdout);
#ifdef FEATURE_USERNAME #ifdef FEATURE_USERNAME
if (!(opts & DISP_NUMERIC)) { if (!(opts & DISP_NUMERIC)) {
struct passwd *pw = getpwuid(info->st_uid); scratch[8]='\0';
if (pw) my_getpwuid( scratch, info->st_uid);
fputs(pw->pw_name, stdout); if (*scratch)
fputs(scratch, stdout);
else else
writenum((long)info->st_uid,(short)0); writenum((long)info->st_uid,(short)0);
} else } else
#endif #endif
writenum((long)info->st_uid,(short)0); writenum((long)info->st_uid,(short)0);
tab(24); tab(16);
#ifdef FEATURE_USERNAME #ifdef FEATURE_USERNAME
if (!(opts & DISP_NUMERIC)) { if (!(opts & DISP_NUMERIC)) {
struct group *gr = getgrgid(info->st_gid); scratch[8]='\0';
if (gr) my_getgrgid( scratch, info->st_gid);
fputs(gr->gr_name, stdout); if (*scratch)
fputs(scratch, stdout);
else else
writenum((long)info->st_gid,(short)0); writenum((long)info->st_gid,(short)0);
} else } else
#endif #endif
writenum((long)info->st_gid,(short)0); writenum((long)info->st_gid,(short)0);
tab(33); tab(17);
if (S_ISBLK(mode) || S_ISCHR(mode)) { if (S_ISBLK(mode) || S_ISCHR(mode)) {
writenum((long)MAJOR(info->st_rdev),(short)3); writenum((long)MAJOR(info->st_rdev),(short)3);
fputs(", ", stdout); fputs(", ", stdout);

73
more.c
View File

@ -25,7 +25,9 @@
/* Turning this off makes things a bit smaller (and less pretty) */ /* Turning this off makes things a bit smaller (and less pretty) */
#define BB_MORE_TERM #define BB_FEATURE_USE_TERMIOS
/* Turning this off makes things a bit smaller (and less pretty) */
#define BB_FEATURE_AUTOWIDTH
@ -33,18 +35,16 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
#include <sys/ioctl.h>
static const char more_usage[] = "[file ...]"; static const char more_usage[] = "[file ...]";
/* ED: sparc termios is broken: revert back to old termio handling. */ /* ED: sparc termios is broken: revert back to old termio handling. */
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
#if #cpu(sparc) #if #cpu(sparc)
# define USE_OLD_TERMIO # define USE_OLD_TERMIO
# include <termio.h> # include <termio.h>
# include <sys/ioctl.h>
# define termios termio # define termios termio
# define stty(fd,argp) ioctl(fd,TCSETAF,argp) # define stty(fd,argp) ioctl(fd,TCSETAF,argp)
#else #else
@ -57,16 +57,35 @@ static const char more_usage[] = "[file ...]";
void gotsig(int sig) { void gotsig(int sig) {
stty(fileno(cin), &initial_settings); stty(fileno(cin), &initial_settings);
fprintf(stdout, "\n");
exit( TRUE); exit( TRUE);
} }
#endif #endif
#define TERMINAL_WIDTH 79 /* not 80 in case terminal has linefold bug */
#define TERMINAL_HEIGHT 24
#if defined BB_FEATURE_AUTOWIDTH && ! defined USE_OLD_TERMIO
static int terminal_width = 0, terminal_height = 0;
#else
#define terminal_width TERMINAL_WIDTH
#define terminal_height TERMINAL_HEIGHT
#endif
extern int more_main(int argc, char **argv) extern int more_main(int argc, char **argv)
{ {
int c, lines=0, input=0; int c, lines=0, input=0;
int next_page=0; int next_page=0;
struct stat st; struct stat st;
FILE *file; FILE *file;
#ifdef BB_FEATURE_AUTOWIDTH
struct winsize win;
#endif
argc--; argc--;
argv++; argv++;
@ -87,7 +106,7 @@ extern int more_main(int argc, char **argv)
} }
fstat(fileno(file), &st); fstat(fileno(file), &st);
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
cin = fopen("/dev/tty", "r"); cin = fopen("/dev/tty", "r");
if (!cin) if (!cin)
cin = fopen("/dev/console", "r"); cin = fopen("/dev/console", "r");
@ -100,12 +119,19 @@ extern int more_main(int argc, char **argv)
new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO; new_settings.c_lflag &= ~ECHO;
stty(fileno(cin), &new_settings); stty(fileno(cin), &new_settings);
#ifdef BB_FEATURE_AUTOWIDTH
ioctl(STDOUT_FILENO, TIOCGWINSZ, &win);
if (win.ws_row > 4)
terminal_height = win.ws_row - 2;
if (win.ws_col > 0)
terminal_width = win.ws_col - 1;
#endif
(void) signal(SIGINT, gotsig); (void) signal(SIGINT, gotsig);
(void) signal(SIGQUIT, gotsig); (void) signal(SIGQUIT, gotsig);
(void) signal(SIGTERM, gotsig); (void) signal(SIGTERM, gotsig);
#endif #endif
while ((c = getc(file)) != EOF) { while ((c = getc(file)) != EOF) {
if ( next_page ) { if ( next_page ) {
@ -119,7 +145,7 @@ extern int more_main(int argc, char **argv)
st.st_size); st.st_size);
} }
len += fprintf(stdout, "%s", len += fprintf(stdout, "%s",
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
"" ""
#else #else
"\n" "\n"
@ -129,24 +155,31 @@ extern int more_main(int argc, char **argv)
fflush(stdout); fflush(stdout);
input = getc( cin); input = getc( cin);
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
/* Erase the "More" message */ /* Erase the "More" message */
while(len-- > 0) while(--len >= 0)
putc('\b', stdout); putc('\b', stdout);
while(len++ < 79) while(++len <= terminal_width)
putc(' ', stdout); putc(' ', stdout);
while(len-- > 0) while(--len >= 0)
putc('\b', stdout); putc('\b', stdout);
fflush(stdout); fflush(stdout);
#endif #endif
} }
if (input=='q') if (c == '\n' ) {
goto end; switch(input) {
if (input=='\n' && c == '\n' ) case 'q':
next_page = 1; goto end;
if ( c == ' ' && ++lines == 24 ) case '\n':
next_page = 1; /* increment by just one line if we are at
* the end of this line*/
next_page = 1;
break;
}
if ( ++lines == terminal_height )
next_page = 1;
}
putc(c, stdout); putc(c, stdout);
} }
fclose(file); fclose(file);
@ -155,7 +188,7 @@ extern int more_main(int argc, char **argv)
argv++; argv++;
} while (--argc > 0); } while (--argc > 0);
end: end:
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
gotsig(0); gotsig(0);
#endif #endif
exit(TRUE); exit(TRUE);

View File

@ -74,7 +74,7 @@ static void parse_proc_status(char* S, proc_t* P)
); );
else fprintf(stderr, "Internal error!\n"); else fprintf(stderr, "Internal error!\n");
/* For busybox, ignoring effecting, saved, etc */ /* For busybox, ignoring effective, saved, etc */
tmp = strstr (S,"Uid:"); tmp = strstr (S,"Uid:");
if(tmp) sscanf (tmp, if(tmp) sscanf (tmp,
"Uid:\t%d", &P->ruid); "Uid:\t%d", &P->ruid);

2
ps.c
View File

@ -74,7 +74,7 @@ static void parse_proc_status(char* S, proc_t* P)
); );
else fprintf(stderr, "Internal error!\n"); else fprintf(stderr, "Internal error!\n");
/* For busybox, ignoring effecting, saved, etc */ /* For busybox, ignoring effective, saved, etc */
tmp = strstr (S,"Uid:"); tmp = strstr (S,"Uid:");
if(tmp) sscanf (tmp, if(tmp) sscanf (tmp,
"Uid:\t%d", &P->ruid); "Uid:\t%d", &P->ruid);

View File

@ -50,7 +50,6 @@ extern int replace_match(char *haystack, char *needle, char *newNeedle, int igno
} while (regexec(re, s, FALSE, ignoreCase) == TRUE); } while (regexec(re, s, FALSE, ignoreCase) == TRUE);
/* copy stuff from after the match */ /* copy stuff from after the match */
while ( (*d++ = *s++) ) {} while ( (*d++ = *s++) ) {}
d[-1] = '\n';
d[0] = '\0'; d[0] = '\0';
strcpy(haystack, buf); strcpy(haystack, buf);
} }

2
rm.c
View File

@ -84,7 +84,7 @@ extern int rm_main(int argc, char **argv)
while (argc-- > 0) { while (argc-- > 0) {
srcName = *(argv++); srcName = *(argv++);
if (recursiveAction( srcName, recursiveFlag, TRUE, TRUE, if (recursiveAction( srcName, recursiveFlag, FALSE, TRUE,
fileAction, dirAction) == FALSE) { fileAction, dirAction) == FALSE) {
exit( FALSE); exit( FALSE);
} }

72
sed.c
View File

@ -45,9 +45,23 @@ static const char sed_usage[] =
#else #else
"This version of sed matches strings (not full regexps).\n"; "This version of sed matches strings (not full regexps).\n";
#endif #endif
static void do_sed(FILE *fp, char *needle, char *newNeedle, int ignoreCase, int printFlag, int quietFlag)
{
int foundOne=FALSE;
char haystack[1024];
while (fgets (haystack, 1023, fp)) {
foundOne = replace_match(haystack, needle, newNeedle, ignoreCase);
if (foundOne==TRUE && printFlag==TRUE) {
fprintf(stdout, haystack);
}
if (quietFlag==FALSE) {
fprintf(stdout, haystack);
}
}
}
extern int sed_main (int argc, char **argv) extern int sed_main (int argc, char **argv)
{ {
@ -56,11 +70,9 @@ extern int sed_main (int argc, char **argv)
char *name; char *name;
char *cp; char *cp;
int ignoreCase=FALSE; int ignoreCase=FALSE;
int foundOne=FALSE;
int printFlag=FALSE; int printFlag=FALSE;
int quietFlag=FALSE; int quietFlag=FALSE;
int stopNow; int stopNow;
char *haystack;
argc--; argc--;
argv++; argv++;
@ -73,24 +85,23 @@ extern int sed_main (int argc, char **argv)
cp = *argv++; cp = *argv++;
stopNow=FALSE; stopNow=FALSE;
while (*++cp && stopNow==FALSE) while (*++cp && stopNow==FALSE) {
switch (*cp) { switch (*cp) {
case 'n': case 'n':
quietFlag = TRUE; quietFlag = TRUE;
break; break;
case 'e': case 'e':
if (*(cp+1)==0 && --argc < 0) { if (*(cp+1)==0 && --argc < 0) {
fprintf(stderr, "A\n");
usage( sed_usage); usage( sed_usage);
} }
cp = *argv++; if ( *++cp != 's')
cp = *argv++;
while( *cp ) { while( *cp ) {
if (*cp == 's' && strlen(cp) > 3 && *(cp+1) == '/') { if (*cp == 's' && strlen(cp) > 3 && *(cp+1) == '/') {
char* pos=needle=cp+2; char* pos=needle=cp+2;
for(;;) { for(;;) {
pos = strchr(pos, '/'); pos = strchr(pos, '/');
if (pos==NULL) { if (pos==NULL) {
fprintf(stderr, "B\n");
usage( sed_usage); usage( sed_usage);
} }
if (*(pos-1) == '\\') { if (*(pos-1) == '\\') {
@ -104,7 +115,6 @@ extern int sed_main (int argc, char **argv)
for(;;) { for(;;) {
pos = strchr(pos, '/'); pos = strchr(pos, '/');
if (pos==NULL) { if (pos==NULL) {
fprintf(stderr, "C\n");
usage( sed_usage); usage( sed_usage);
} }
if (*(pos-1) == '\\') { if (*(pos-1) == '\\') {
@ -116,7 +126,6 @@ extern int sed_main (int argc, char **argv)
*pos=0; *pos=0;
if (pos+2 != 0) { if (pos+2 != 0) {
while (*++pos) { while (*++pos) {
fprintf(stderr, "pos='%s'\n", pos);
switch (*pos) { switch (*pos) {
case 'i': case 'i':
ignoreCase=TRUE; ignoreCase=TRUE;
@ -134,42 +143,35 @@ extern int sed_main (int argc, char **argv)
} }
cp++; cp++;
} }
fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); //fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle);
stopNow=TRUE; stopNow=TRUE;
break; break;
default: default:
fprintf(stderr, "D\n");
usage(sed_usage); usage(sed_usage);
} }
}
} }
while (argc-- > 0) { if (argc==0) {
name = *argv++; do_sed( stdin, needle, newNeedle, ignoreCase, printFlag, quietFlag);
} else {
while (argc-- > 0) {
name = *argv++;
fp = fopen (name, "r"); fp = fopen (name, "r");
if (fp == NULL) { if (fp == NULL) {
perror (name); perror (name);
continue; continue;
}
do_sed( fp, needle, newNeedle, ignoreCase, printFlag, quietFlag);
if (ferror (fp))
perror (name);
fclose (fp);
} }
haystack = (char*)malloc( 1024);
while (fgets (haystack, 1023, fp)) {
foundOne = replace_match(haystack, needle, newNeedle, ignoreCase);
if (foundOne==TRUE && printFlag==TRUE)
fputs (haystack, stdout);
if (quietFlag==FALSE)
fputs (haystack, stdout);
/* Avoid any mem leaks */
free(haystack);
haystack = (char*)malloc( BUF_SIZE);
}
if (ferror (fp))
perror (name);
fclose (fp);
} }
exit( TRUE); exit( TRUE);
} }

15
tar.c
View File

@ -35,6 +35,16 @@
#include <signal.h> #include <signal.h>
#include <time.h> #include <time.h>
/* Note that tar.c expects TRUE and FALSE to be defined
* exactly the opposite of how they are used everywhere else.
* Some time this should be integrated a bit better, but this
* does the job for now.
*/
#undef FALSE
#undef TRUE
#define FALSE ((int) 0)
#define TRUE ((int) 1)
static const char tar_usage[] = static const char tar_usage[] =
"tar -[cxtvOf] [tarFileName] [FILE] ...\n" "tar -[cxtvOf] [tarFileName] [FILE] ...\n"
@ -169,10 +179,9 @@ extern int tar_main (int argc, char **argv)
/* /*
* Parse the options. * Parse the options.
*/ */
options = *argv++;
argc--;
if (**argv == '-') { if (**argv == '-') {
options = (*argv++) + 1;
argc--;
for (; *options; options++) { for (; *options; options++) {
switch (*options) { switch (*options) {
case 'f': case 'f':

View File

@ -25,7 +25,9 @@
/* Turning this off makes things a bit smaller (and less pretty) */ /* Turning this off makes things a bit smaller (and less pretty) */
#define BB_MORE_TERM #define BB_FEATURE_USE_TERMIOS
/* Turning this off makes things a bit smaller (and less pretty) */
#define BB_FEATURE_AUTOWIDTH
@ -33,18 +35,16 @@
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
#include <sys/ioctl.h>
static const char more_usage[] = "[file ...]"; static const char more_usage[] = "[file ...]";
/* ED: sparc termios is broken: revert back to old termio handling. */ /* ED: sparc termios is broken: revert back to old termio handling. */
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
#if #cpu(sparc) #if #cpu(sparc)
# define USE_OLD_TERMIO # define USE_OLD_TERMIO
# include <termio.h> # include <termio.h>
# include <sys/ioctl.h>
# define termios termio # define termios termio
# define stty(fd,argp) ioctl(fd,TCSETAF,argp) # define stty(fd,argp) ioctl(fd,TCSETAF,argp)
#else #else
@ -57,16 +57,35 @@ static const char more_usage[] = "[file ...]";
void gotsig(int sig) { void gotsig(int sig) {
stty(fileno(cin), &initial_settings); stty(fileno(cin), &initial_settings);
fprintf(stdout, "\n");
exit( TRUE); exit( TRUE);
} }
#endif #endif
#define TERMINAL_WIDTH 79 /* not 80 in case terminal has linefold bug */
#define TERMINAL_HEIGHT 24
#if defined BB_FEATURE_AUTOWIDTH && ! defined USE_OLD_TERMIO
static int terminal_width = 0, terminal_height = 0;
#else
#define terminal_width TERMINAL_WIDTH
#define terminal_height TERMINAL_HEIGHT
#endif
extern int more_main(int argc, char **argv) extern int more_main(int argc, char **argv)
{ {
int c, lines=0, input=0; int c, lines=0, input=0;
int next_page=0; int next_page=0;
struct stat st; struct stat st;
FILE *file; FILE *file;
#ifdef BB_FEATURE_AUTOWIDTH
struct winsize win;
#endif
argc--; argc--;
argv++; argv++;
@ -87,7 +106,7 @@ extern int more_main(int argc, char **argv)
} }
fstat(fileno(file), &st); fstat(fileno(file), &st);
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
cin = fopen("/dev/tty", "r"); cin = fopen("/dev/tty", "r");
if (!cin) if (!cin)
cin = fopen("/dev/console", "r"); cin = fopen("/dev/console", "r");
@ -100,12 +119,19 @@ extern int more_main(int argc, char **argv)
new_settings.c_lflag &= ~ICANON; new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO; new_settings.c_lflag &= ~ECHO;
stty(fileno(cin), &new_settings); stty(fileno(cin), &new_settings);
#ifdef BB_FEATURE_AUTOWIDTH
ioctl(STDOUT_FILENO, TIOCGWINSZ, &win);
if (win.ws_row > 4)
terminal_height = win.ws_row - 2;
if (win.ws_col > 0)
terminal_width = win.ws_col - 1;
#endif
(void) signal(SIGINT, gotsig); (void) signal(SIGINT, gotsig);
(void) signal(SIGQUIT, gotsig); (void) signal(SIGQUIT, gotsig);
(void) signal(SIGTERM, gotsig); (void) signal(SIGTERM, gotsig);
#endif #endif
while ((c = getc(file)) != EOF) { while ((c = getc(file)) != EOF) {
if ( next_page ) { if ( next_page ) {
@ -119,7 +145,7 @@ extern int more_main(int argc, char **argv)
st.st_size); st.st_size);
} }
len += fprintf(stdout, "%s", len += fprintf(stdout, "%s",
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
"" ""
#else #else
"\n" "\n"
@ -129,24 +155,31 @@ extern int more_main(int argc, char **argv)
fflush(stdout); fflush(stdout);
input = getc( cin); input = getc( cin);
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
/* Erase the "More" message */ /* Erase the "More" message */
while(len-- > 0) while(--len >= 0)
putc('\b', stdout); putc('\b', stdout);
while(len++ < 79) while(++len <= terminal_width)
putc(' ', stdout); putc(' ', stdout);
while(len-- > 0) while(--len >= 0)
putc('\b', stdout); putc('\b', stdout);
fflush(stdout); fflush(stdout);
#endif #endif
} }
if (input=='q') if (c == '\n' ) {
goto end; switch(input) {
if (input=='\n' && c == '\n' ) case 'q':
next_page = 1; goto end;
if ( c == ' ' && ++lines == 24 ) case '\n':
next_page = 1; /* increment by just one line if we are at
* the end of this line*/
next_page = 1;
break;
}
if ( ++lines == terminal_height )
next_page = 1;
}
putc(c, stdout); putc(c, stdout);
} }
fclose(file); fclose(file);
@ -155,7 +188,7 @@ extern int more_main(int argc, char **argv)
argv++; argv++;
} while (--argc > 0); } while (--argc > 0);
end: end:
#ifdef BB_MORE_TERM #ifdef BB_FEATURE_USE_TERMIOS
gotsig(0); gotsig(0);
#endif #endif
exit(TRUE); exit(TRUE);

View File

@ -415,8 +415,12 @@ recursiveAction(const char *fileName, int recurse, int followLinks, int depthFir
return (FALSE); return (FALSE);
} }
if ( (followLinks == FALSE) && (S_ISLNK(statbuf.st_mode)) ) if ( (followLinks == FALSE) && (S_ISLNK(statbuf.st_mode)) ) {
return (TRUE); if (fileAction == NULL)
return (TRUE);
else
return (fileAction(fileName, &statbuf));
}
if (recurse == FALSE) { if (recurse == FALSE) {
if (S_ISDIR(statbuf.st_mode)) { if (S_ISDIR(statbuf.st_mode)) {