More stuff -- ready for release. -Erik
No binary (build failed)
—
(log yok)
| @@ -9,10 +9,18 @@ | |
| * Wrote sed -- weighs only 1.8k (5.8k with full regular expressions!). | |
| * Fixed a stupid seg-fault in sync | |
| * Fixed mount -- mount -a failed to parse and apply mount options | |
| + | * Fixed umount -n (patch thanks to Matthew Grant <[email protected]>) |
| + | * umount -a no longer umounts /proc |
| * Added BB_MTAB, allowing (at the cost of ~1.5k and the need for a rw /etc) | |
| folks to use a real /etc/mtab file instead of a symlink to /proc/mounts. | |
| mount, and umount will add/remove entries and df will now use /etc/mtab | |
| if BB_MTAB is defined. | |
| + | * Fixed a nice bug in recursiveAction() which caused it to infinitely |
| + | hunt through /proc/../fd/* creating new file descriptors if it |
| + | followed the /dev/fd link over to /proc. recursiveAction() now |
| + | lstat's the file when followLinks==FALSE so it won't follow links |
| + | as the name suggests. Fix thanks to Matt Porter <[email protected]>. |
| + | |
| -Erik Andersen | |
| @@ -38,7 +38,7 @@ | |
| #define BB_MORE | |
| #define BB_MOUNT | |
| //#define BB_MT | |
| - | #define BB_MTAB |
| + | //#define BB_MTAB |
| #define BB_MV | |
| //#define BB_PRINTF | |
| #define BB_PS | |
| @@ -123,13 +123,6 @@ void message(int device, char *fmt, ...) | |
| void set_term( int fd) | |
| { | |
| struct termios tty; | |
| - | #if 0 |
| - | static const char control_characters[] = { |
| - | '\003', '\034', '\177', '\025', '\004', '\0', |
| - | '\1', '\0', '\021', '\023', '\032', '\0', '\022', |
| - | '\017', '\027', '\026', '\0' |
| - | }; |
| - | #endif |
| static const char control_characters[] = { | |
| '\003', '\034', '\177', '\030', '\004', '\0', | |
| '\1', '\0', '\021', '\023', '\032', '\0', '\022', | |
| @@ -160,44 +153,6 @@ void set_term( int fd) | |
| tcsetattr(fd, TCSANOW, &tty); | |
| } | |
| - | /* Set terminal settings to reasonable defaults */ |
| - | void set_term_old( int fd) |
| - | { |
| - | struct termios tty; |
| - | |
| - | ioctl(fd, TCGETA, &tty); |
| - | |
| - | tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD; |
| - | tty.c_cflag |= HUPCL|CLOCAL; |
| - | |
| - | tty.c_cc[VINTR] = 3; |
| - | tty.c_cc[VQUIT] = 28; |
| - | tty.c_cc[VERASE] = 127; |
| - | //tty.c_cc[VKILL] = 21; |
| - | tty.c_cc[VKILL] = 24; |
| - | tty.c_cc[VEOF] = 4; |
| - | tty.c_cc[VTIME] = 0; |
| - | tty.c_cc[VMIN] = 1; |
| - | tty.c_cc[VSWTC] = 0; |
| - | tty.c_cc[VSTART] = 17; |
| - | tty.c_cc[VSTOP] = 19; |
| - | tty.c_cc[VSUSP] = 26; |
| - | tty.c_cc[VEOL] = 0; |
| - | tty.c_cc[VREPRINT] = 18; |
| - | tty.c_cc[VDISCARD] = 15; |
| - | tty.c_cc[VWERASE] = 23; |
| - | tty.c_cc[VLNEXT] = 22; |
| - | tty.c_cc[VEOL2] = 0; |
| - | |
| - | |
| - | tty.c_line = 0; |
| - | tty.c_iflag = IGNPAR|ICRNL|IXON|IXOFF|IXANY; |
| - | tty.c_oflag = OPOST|ONLCR; |
| - | tty.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOPRT|ECHOKE|IEXTEN; |
| - | |
| - | ioctl(fd, TCSETA, &tty); |
| - | } |
| - | |
| /* How much memory does this machine have? */ | |
| static int mem_total() | |
| { | |
| @@ -395,7 +350,12 @@ static void shutdown_system(void) | |
| waitfor(run( swap_off_cmd, console, FALSE)); | |
| waitfor(run( umount_cmd, console, FALSE)); | |
| sync(); | |
| - | bdflush(1, 0); |
| + | message(CONSOLE, "Skipping bdflush\r\n"); |
| + | if (get_kernel_revision() <= 2 * 65536 + 2 * 256 + 11) { |
| + | /* bdflush, kupdate not needed for kernels >2.2.11 */ |
| + | bdflush(1, 0); |
| + | sync(); |
| + | } |
| } | |
| static void halt_signal(int sig) | |
| @@ -518,15 +478,19 @@ extern int init_main(int argc, char **argv) | |
| if (wpid > 0 ) { | |
| message(LOG, "pid %d exited, status=%x.\n", wpid, status); | |
| } | |
| + | /* Don't respawn init script if it exits */ |
| if (wpid == pid1) { | |
| - | pid1 = 0; |
| - | if (run_rc == TRUE) { |
| - | /* Don't respawn init script if it exits, |
| - | * Start a shell instead. */ |
| + | if (run_rc == FALSE) { |
| + | pid1 = 0; |
| + | } |
| + | #if 0 |
| + | /* Turn this on to start a shell on the console if the init script exits.... */ |
| + | else { |
| run_rc=FALSE; | |
| wait_for_enter=TRUE; | |
| tty0_commands=shell_commands; | |
| } | |
| + | #endif |
| } | |
| if (wpid == pid2) { | |
| pid2 = 0; | |
| @@ -123,13 +123,6 @@ void message(int device, char *fmt, ...) | |
| void set_term( int fd) | |
| { | |
| struct termios tty; | |
| - | #if 0 |
| - | static const char control_characters[] = { |
| - | '\003', '\034', '\177', '\025', '\004', '\0', |
| - | '\1', '\0', '\021', '\023', '\032', '\0', '\022', |
| - | '\017', '\027', '\026', '\0' |
| - | }; |
| - | #endif |
| static const char control_characters[] = { | |
| '\003', '\034', '\177', '\030', '\004', '\0', | |
| '\1', '\0', '\021', '\023', '\032', '\0', '\022', | |
| @@ -160,44 +153,6 @@ void set_term( int fd) | |
| tcsetattr(fd, TCSANOW, &tty); | |
| } | |
| - | /* Set terminal settings to reasonable defaults */ |
| - | void set_term_old( int fd) |
| - | { |
| - | struct termios tty; |
| - | |
| - | ioctl(fd, TCGETA, &tty); |
| - | |
| - | tty.c_cflag &= CBAUD|CBAUDEX|CSIZE|CSTOPB|PARENB|PARODD; |
| - | tty.c_cflag |= HUPCL|CLOCAL; |
| - | |
| - | tty.c_cc[VINTR] = 3; |
| - | tty.c_cc[VQUIT] = 28; |
| - | tty.c_cc[VERASE] = 127; |
| - | //tty.c_cc[VKILL] = 21; |
| - | tty.c_cc[VKILL] = 24; |
| - | tty.c_cc[VEOF] = 4; |
| - | tty.c_cc[VTIME] = 0; |
| - | tty.c_cc[VMIN] = 1; |
| - | tty.c_cc[VSWTC] = 0; |
| - | tty.c_cc[VSTART] = 17; |
| - | tty.c_cc[VSTOP] = 19; |
| - | tty.c_cc[VSUSP] = 26; |
| - | tty.c_cc[VEOL] = 0; |
| - | tty.c_cc[VREPRINT] = 18; |
| - | tty.c_cc[VDISCARD] = 15; |
| - | tty.c_cc[VWERASE] = 23; |
| - | tty.c_cc[VLNEXT] = 22; |
| - | tty.c_cc[VEOL2] = 0; |
| - | |
| - | |
| - | tty.c_line = 0; |
| - | tty.c_iflag = IGNPAR|ICRNL|IXON|IXOFF|IXANY; |
| - | tty.c_oflag = OPOST|ONLCR; |
| - | tty.c_lflag = ISIG|ICANON|ECHO|ECHOE|ECHOK|ECHOCTL|ECHOPRT|ECHOKE|IEXTEN; |
| - | |
| - | ioctl(fd, TCSETA, &tty); |
| - | } |
| - | |
| /* How much memory does this machine have? */ | |
| static int mem_total() | |
| { | |
| @@ -395,7 +350,12 @@ static void shutdown_system(void) | |
| waitfor(run( swap_off_cmd, console, FALSE)); | |
| waitfor(run( umount_cmd, console, FALSE)); | |
| sync(); | |
| - | bdflush(1, 0); |
| + | message(CONSOLE, "Skipping bdflush\r\n"); |
| + | if (get_kernel_revision() <= 2 * 65536 + 2 * 256 + 11) { |
| + | /* bdflush, kupdate not needed for kernels >2.2.11 */ |
| + | bdflush(1, 0); |
| + | sync(); |
| + | } |
| } | |
| static void halt_signal(int sig) | |
| @@ -518,15 +478,19 @@ extern int init_main(int argc, char **argv) | |
| if (wpid > 0 ) { | |
| message(LOG, "pid %d exited, status=%x.\n", wpid, status); | |
| } | |
| + | /* Don't respawn init script if it exits */ |
| if (wpid == pid1) { | |
| - | pid1 = 0; |
| - | if (run_rc == TRUE) { |
| - | /* Don't respawn init script if it exits, |
| - | * Start a shell instead. */ |
| + | if (run_rc == FALSE) { |
| + | pid1 = 0; |
| + | } |
| + | #if 0 |
| + | /* Turn this on to start a shell on the console if the init script exits.... */ |
| + | else { |
| run_rc=FALSE; | |
| wait_for_enter=TRUE; | |
| tty0_commands=shell_commands; | |
| } | |
| + | #endif |
| } | |
| if (wpid == pid2) { | |
| pid2 = 0; | |
| @@ -76,6 +76,10 @@ umount_all(int useMtab) | |
| if (strcmp (blockDevice, "/dev/root") == 0) | |
| blockDevice = (getfsfile ("/"))->fs_spec; | |
| #endif | |
| + | /* Don't umount /proc when doing umount -a */ |
| + | if (strcmp (blockDevice, "proc") == 0) |
| + | continue; |
| + | |
| status=do_umount (m->mnt_dir, useMtab); | |
| if (status!=0) { | |
| /* Don't bother retrying the umount on busy devices */ | |
| @@ -83,9 +87,6 @@ umount_all(int useMtab) | |
| perror(m->mnt_dir); | |
| continue; | |
| } | |
| - | printf ("Trying to umount %s failed: %s\n", |
| - | m->mnt_dir, strerror(errno)); |
| - | printf ("Instead trying to umount %s\n", blockDevice); |
| status=do_umount (blockDevice, useMtab); | |
| if (status!=0) { | |
| printf ("Couldn't umount %s on %s (type %s): %s\n", | |
| @@ -107,7 +108,7 @@ umount_main(int argc, char** argv) | |
| } | |
| /* Parse any options */ | |
| - | while (argc-- > 0 && **(++argv) == '-') { |
| + | while (argc-- > 0 && **(argv++) == '-') { |
| while (*++(*argv)) switch (**argv) { | |
| case 'a': | |
| umountAll = TRUE; | |
| @@ -76,6 +76,10 @@ umount_all(int useMtab) | |
| if (strcmp (blockDevice, "/dev/root") == 0) | |
| blockDevice = (getfsfile ("/"))->fs_spec; | |
| #endif | |
| + | /* Don't umount /proc when doing umount -a */ |
| + | if (strcmp (blockDevice, "proc") == 0) |
| + | continue; |
| + | |
| status=do_umount (m->mnt_dir, useMtab); | |
| if (status!=0) { | |
| /* Don't bother retrying the umount on busy devices */ | |
| @@ -83,9 +87,6 @@ umount_all(int useMtab) | |
| perror(m->mnt_dir); | |
| continue; | |
| } | |
| - | printf ("Trying to umount %s failed: %s\n", |
| - | m->mnt_dir, strerror(errno)); |
| - | printf ("Instead trying to umount %s\n", blockDevice); |
| status=do_umount (blockDevice, useMtab); | |
| if (status!=0) { | |
| printf ("Couldn't umount %s on %s (type %s): %s\n", | |
| @@ -107,7 +108,7 @@ umount_main(int argc, char** argv) | |
| } | |
| /* Parse any options */ | |
| - | while (argc-- > 0 && **(++argv) == '-') { |
| + | while (argc-- > 0 && **(argv++) == '-') { |
| while (*++(*argv)) switch (**argv) { | |
| case 'a': | |
| umountAll = TRUE; | |
| @@ -393,7 +393,8 @@ int fullRead(int fd, char *buf, int len) | |
| * | |
| * Unfortunatly, while nftw(3) could replace this and reduce | |
| * code size a bit, nftw() wasn't supported before GNU libc 2.1, | |
| - | * and so isn't sufficiently portable to take over... |
| + | * and so isn't sufficiently portable to take over since glibc2.1 |
| + | * is so stinking huge. |
| */ | |
| int | |
| recursiveAction(const char *fileName, int recurse, int followLinks, int depthFirst, | |
| @@ -404,7 +405,7 @@ recursiveAction(const char *fileName, int recurse, int followLinks, int depthFir | |
| struct stat statbuf; | |
| struct dirent *next; | |
| - | if (followLinks == FALSE) |
| + | if (followLinks == TRUE) |
| status = stat(fileName, &statbuf); | |
| else | |
| status = lstat(fileName, &statbuf); | |
| @@ -414,6 +415,9 @@ recursiveAction(const char *fileName, int recurse, int followLinks, int depthFir | |
| return (FALSE); | |
| } | |
| + | if ( (followLinks == FALSE) && (S_ISLNK(statbuf.st_mode)) ) |
| + | return (TRUE); |
| + | |
| if (recurse == FALSE) { | |
| if (S_ISDIR(statbuf.st_mode)) { | |
| if (dirAction != NULL) | |