More stuff -- ready for release. 0_32
authorEric Andersen <andersen@codepoet.org>
Fri, 5 Nov 1999 00:31:46 +0000 (00:31 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 5 Nov 1999 00:31:46 +0000 (00:31 -0000)
 -Erik

Changelog
busybox.def.h
init.c
init/init.c
umount.c
util-linux/umount.c
utility.c

index cd0ca0a353f46853bea178837a4853268d66fd44..1161f8bb3eecf8e50d0371e9da152fc824f34224 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -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 <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
 
index 88004631804023815afb6454b440e41498849394..59c1df18832e7d4690876300bb8650f897b6843f 100644 (file)
@@ -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
diff --git a/init.c b/init.c
index 55c5c7318effa9821d11aedd76636cfa126fbb75..87746ef865f96ea09ed317577a6bb9df8d7687f1 100644 (file)
--- a/init.c
+++ b/init.c
@@ -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;
index 55c5c7318effa9821d11aedd76636cfa126fbb75..87746ef865f96ea09ed317577a6bb9df8d7687f1 100644 (file)
@@ -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;
index e749c5f0feceaab74676e8d183c6dbb863062978..89c59f9ee81df3f38f1749e0ca908386c3fee5b6 100644 (file)
--- a/umount.c
+++ b/umount.c
@@ -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;
index e749c5f0feceaab74676e8d183c6dbb863062978..89c59f9ee81df3f38f1749e0ca908386c3fee5b6 100644 (file)
@@ -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;
index 125e819edd8a6181cddaa63a15e2fa372db1beb6..50d019254986e657fbe385d9dc0b37e428202368 100644 (file)
--- a/utility.c
+++ b/utility.c
@@ -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)