* 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 <grantma@anathoth.gen.nz>)
+ * 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 <porter@debian.org>.
+
-Erik Andersen
#define BB_MORE
#define BB_MOUNT
//#define BB_MT
-#define BB_MTAB
+//#define BB_MTAB
#define BB_MV
//#define BB_PRINTF
#define BB_PS
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',
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()
{
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)
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;
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',
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()
{
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)
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;
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 */
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",
}
/* Parse any options */
- while (argc-- > 0 && **(++argv) == '-') {
+ while (argc-- > 0 && **(argv++) == '-') {
while (*++(*argv)) switch (**argv) {
case 'a':
umountAll = TRUE;
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 */
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",
}
/* Parse any options */
- while (argc-- > 0 && **(++argv) == '-') {
+ while (argc-- > 0 && **(argv++) == '-') {
while (*++(*argv)) switch (**argv) {
case 'a':
umountAll = TRUE;
*
* 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,
struct stat statbuf;
struct dirent *next;
- if (followLinks == FALSE)
+ if (followLinks == TRUE)
status = stat(fileName, &statbuf);
else
status = lstat(fileName, &statbuf);
return (FALSE);
}
+ if ( (followLinks == FALSE) && (S_ISLNK(statbuf.st_mode)) )
+ return (TRUE);
+
if (recurse == FALSE) {
if (S_ISDIR(statbuf.st_mode)) {
if (dirAction != NULL)