Stuf
authorEric Andersen <andersen@codepoet.org>
Sun, 5 Dec 1999 23:24:55 +0000 (23:24 -0000)
committerEric Andersen <andersen@codepoet.org>
Sun, 5 Dec 1999 23:24:55 +0000 (23:24 -0000)
12 files changed:
Changelog
busybox.def.h
init.c
init/init.c
mount.c
mtab.c
procps/ps.c
ps.c
sysklogd/syslogd.c
syslogd.c
util-linux/mount.c
utility.c

index 378b698e377acbc25783ca4966c6d6061e826cba..668695f3c4bc4a6b4db257fc4662c316bc38c57b 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -8,7 +8,12 @@
            was causing some confusing and unexpected behavior.
        * Added klogd to syslogd, so now the log will contain both system and
            kernel messages.
-           
+       * syslogd now creates the /dev/log socket to make sure it is there, and
+           is actually a socket with the right permissions.
+       * I've taken a first step to making busybox not need the /proc filesystem.
+           Most apps don't need it.  Those that _require_ it, will complain
+           if you enable them when you disable BB_FEATURE_USE_PROCFS.
+          
        -Erik Andrsen
 
 0.37
index bf8f54556b0c1f3e29a338b08debb207db6f7857..a1f55ffe60625bd6bac5f8813f5b56207868c626 100644 (file)
@@ -74,6 +74,8 @@
 // pretty/useful).
 //
 //
+// enable features that use the /proc filesystem
+#define BB_FEATURE_USE_PROCFS
 //Enable init being called as /linuxrc
 #define BB_FEATURE_LINUXRC
 // Use termios to manipulate the screen ('more' is prettier with this on)
diff --git a/init.c b/init.c
index 088a890cc6132cc6944283cbb06729d0cc8917d5..84b558d84901acc28a40dacb4de932b9b037abcd 100644 (file)
--- a/init.c
+++ b/init.c
 #include <sys/syslog.h>
 #endif
 
+#if ! defined BB_FEATURE_USE_PROCFS
+#error Sorry, I depend on the /proc filesystem right now.
+#endif
+
+
 #define VT_PRIMARY      "/dev/tty1"    /* Primary virtual console */
 #define VT_SECONDARY    "/dev/tty2"    /* Virtual console */
 #define VT_LOG          "/dev/tty3"    /* Virtual console */
index 088a890cc6132cc6944283cbb06729d0cc8917d5..84b558d84901acc28a40dacb4de932b9b037abcd 100644 (file)
 #include <sys/syslog.h>
 #endif
 
+#if ! defined BB_FEATURE_USE_PROCFS
+#error Sorry, I depend on the /proc filesystem right now.
+#endif
+
+
 #define VT_PRIMARY      "/dev/tty1"    /* Primary virtual console */
 #define VT_SECONDARY    "/dev/tty2"    /* Virtual console */
 #define VT_LOG          "/dev/tty3"    /* Virtual console */
diff --git a/mount.c b/mount.c
index a9463afbac2ef119c25195b42e82438c73b6a7d1..1ec9cbb5b53e8ebaae47a82833ec72360155aead 100644 (file)
--- a/mount.c
+++ b/mount.c
@@ -163,6 +163,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
 
     char buf[255];
 
+#if defined BB_FEATURE_USE_PROCFS
     if (strcmp(filesystemType, "auto") == 0) {
        FILE *f = fopen ("/proc/filesystems", "r");
 
@@ -189,7 +190,9 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
            }
        }
        fclose (f);
-    } else {
+    } else
+#endif
+    {
        status = do_mount (blockDevice, directory, filesystemType,
                        flags | MS_MGC_VAL, string_flags, useMtab, 
                        fakeIt, mtab_opts);
diff --git a/mtab.c b/mtab.c
index e855717cef76e4e50ed1f519406c1961a86b78d0..98e42a383c8249c89dfad18980841197159c335f 100644 (file)
--- a/mtab.c
+++ b/mtab.c
@@ -26,8 +26,14 @@ erase_mtab(const char * name)
        FILE *mountTable = setmntent(mtab_file, "r");
        struct mntent * m;
 
-       if ( mountTable == 0
-        && (mountTable = setmntent("/proc/mounts", "r")) == 0 ) {
+       /* Check if reading the mtab file failed */
+       if ( mountTable == 0 
+#if ! defined BB_FEATURE_USE_PROCFS
+                             ) {
+#else 
+           /* Bummer.  fall back on trying the /proc filesystem */
+            && (mountTable = setmntent("/proc/mounts", "r")) == 0 ) {
+#endif
                perror(mtab_file);
                return;
        }
@@ -76,13 +82,14 @@ write_mtab(char* blockDevice, char* directory,
            if ( length > 1 && directory[length - 1] == '/' )
                    directory[length - 1] = '\0';
 
+#ifdef BB_FEATURE_USE_PROCFS
            if ( filesystemType == 0 ) {
-                   struct mntent *     p
-                    = findMountPoint(blockDevice, "/proc/mounts");
+                   struct mntent *p = findMountPoint(blockDevice, "/proc/mounts");
 
                    if ( p && p->mnt_type )
                            filesystemType = p->mnt_type;
            }
+#endif
            m.mnt_fsname = blockDevice;
            m.mnt_dir = directory;
            m.mnt_type = filesystemType ? filesystemType : "default";
index 1f6175318681f8e0df74a26185b1f300df2bc99b..4496faa31a4cf9f9fbf669e3c0232c1257481569 100644 (file)
@@ -28,6 +28,9 @@
 #include <fcntl.h>
 #include <ctype.h>
 
+#if ! defined BB_FEATURE_USE_PROCFS
+#error Sorry, I depend on the /proc filesystem right now.
+#endif
 
 typedef struct proc_s {
     char
diff --git a/ps.c b/ps.c
index 1f6175318681f8e0df74a26185b1f300df2bc99b..4496faa31a4cf9f9fbf669e3c0232c1257481569 100644 (file)
--- a/ps.c
+++ b/ps.c
@@ -28,6 +28,9 @@
 #include <fcntl.h>
 #include <ctype.h>
 
+#if ! defined BB_FEATURE_USE_PROCFS
+#error Sorry, I depend on the /proc filesystem right now.
+#endif
 
 typedef struct proc_s {
     char
index e3f45b62a30fc1621e6d54308bab781fa361316d..1f3e3122508f7e6ec7a721d7774e27ee3b9252d4 100644 (file)
@@ -57,13 +57,13 @@ static char LocalHostName[32];
 
 static const char syslogd_usage[] =
     "syslogd [OPTION]...\n\n"
-    "Linux system logging utility.\n\n"
+    "Linux system and kernel (provides klogd) logging utility.\n"
+    "Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n"
     "Options:\n"
     "\t-m\tChange the mark timestamp interval. default=20min. 0=off\n"
     "\t-n\tDo not fork into the background (for when run by init)\n"
     "\t-O\tSpecify an alternate log file.  default=/var/log/messages\n";
 
-static int kmsg;
 
 /* try to open up the specified device */
 static int device_open(char *device, int mode)
@@ -253,10 +253,9 @@ static void doSyslogd(void)
 
 static void klogd_signal(int sig)
 {
-    //ksyslog(7, NULL, 0);
-    //ksyslog(0, 0, 0);
+    ksyslog(7, NULL, 0);
+    ksyslog(0, 0, 0);
     logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon exiting.");
-    close( kmsg);
     exit( TRUE);
 }
 
@@ -264,7 +263,6 @@ static void klogd_signal(int sig)
 static void doKlogd(void)
 {
     int priority=LOG_INFO;
-    struct stat sb;
     char log_buffer[4096];
     char *logp;
 
@@ -277,26 +275,10 @@ static void doKlogd(void)
            "BusyBox v" BB_VER " (" BB_BT ")");
 
     ksyslog(1, NULL, 0);
-    if ( ((stat(_PATH_KLOG, &sb) < 0) && (errno == ENOENT)) ||
-           ( (kmsg = open(_PATH_KLOG, O_RDONLY)) < 0 ) ) {
-       char message[80];
-       snprintf(message, 79, "klogd: Cannot open %s, " \
-               "%d - %s.\n", _PATH_KLOG, errno, strerror(errno));
-       logMessage(LOG_SYSLOG|LOG_ERR, message);
-       klogd_signal(0);
-    }
+
     while (1) {
+       /* Use kernel syscalls */
        memset(log_buffer, '\0', sizeof(log_buffer));
-       if ( read(kmsg, log_buffer, sizeof(log_buffer)-1) < 0 ) {
-           char message[80];
-           if ( errno == EINTR )
-               continue;
-           snprintf(message, 79, "klogd: Cannot read proc file system: %d - %s.\n", 
-                   errno, strerror(errno));
-           logMessage(LOG_SYSLOG|LOG_ERR, message);
-           klogd_signal(0);
-       }
-#if 0
        if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) {
            char message[80];
            if ( errno == EINTR )
@@ -306,7 +288,6 @@ static void doKlogd(void)
            logMessage(LOG_SYSLOG|LOG_ERR, message);
            exit(1);
        }
-#endif
        logp=log_buffer;
         if ( *log_buffer == '<' )
         {
index e3f45b62a30fc1621e6d54308bab781fa361316d..1f3e3122508f7e6ec7a721d7774e27ee3b9252d4 100644 (file)
--- a/syslogd.c
+++ b/syslogd.c
@@ -57,13 +57,13 @@ static char LocalHostName[32];
 
 static const char syslogd_usage[] =
     "syslogd [OPTION]...\n\n"
-    "Linux system logging utility.\n\n"
+    "Linux system and kernel (provides klogd) logging utility.\n"
+    "Note that this version of syslogd/klogd ignores /etc/syslog.conf.\n\n"
     "Options:\n"
     "\t-m\tChange the mark timestamp interval. default=20min. 0=off\n"
     "\t-n\tDo not fork into the background (for when run by init)\n"
     "\t-O\tSpecify an alternate log file.  default=/var/log/messages\n";
 
-static int kmsg;
 
 /* try to open up the specified device */
 static int device_open(char *device, int mode)
@@ -253,10 +253,9 @@ static void doSyslogd(void)
 
 static void klogd_signal(int sig)
 {
-    //ksyslog(7, NULL, 0);
-    //ksyslog(0, 0, 0);
+    ksyslog(7, NULL, 0);
+    ksyslog(0, 0, 0);
     logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon exiting.");
-    close( kmsg);
     exit( TRUE);
 }
 
@@ -264,7 +263,6 @@ static void klogd_signal(int sig)
 static void doKlogd(void)
 {
     int priority=LOG_INFO;
-    struct stat sb;
     char log_buffer[4096];
     char *logp;
 
@@ -277,26 +275,10 @@ static void doKlogd(void)
            "BusyBox v" BB_VER " (" BB_BT ")");
 
     ksyslog(1, NULL, 0);
-    if ( ((stat(_PATH_KLOG, &sb) < 0) && (errno == ENOENT)) ||
-           ( (kmsg = open(_PATH_KLOG, O_RDONLY)) < 0 ) ) {
-       char message[80];
-       snprintf(message, 79, "klogd: Cannot open %s, " \
-               "%d - %s.\n", _PATH_KLOG, errno, strerror(errno));
-       logMessage(LOG_SYSLOG|LOG_ERR, message);
-       klogd_signal(0);
-    }
+
     while (1) {
+       /* Use kernel syscalls */
        memset(log_buffer, '\0', sizeof(log_buffer));
-       if ( read(kmsg, log_buffer, sizeof(log_buffer)-1) < 0 ) {
-           char message[80];
-           if ( errno == EINTR )
-               continue;
-           snprintf(message, 79, "klogd: Cannot read proc file system: %d - %s.\n", 
-                   errno, strerror(errno));
-           logMessage(LOG_SYSLOG|LOG_ERR, message);
-           klogd_signal(0);
-       }
-#if 0
        if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) {
            char message[80];
            if ( errno == EINTR )
@@ -306,7 +288,6 @@ static void doKlogd(void)
            logMessage(LOG_SYSLOG|LOG_ERR, message);
            exit(1);
        }
-#endif
        logp=log_buffer;
         if ( *log_buffer == '<' )
         {
index a9463afbac2ef119c25195b42e82438c73b6a7d1..1ec9cbb5b53e8ebaae47a82833ec72360155aead 100644 (file)
@@ -163,6 +163,7 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
 
     char buf[255];
 
+#if defined BB_FEATURE_USE_PROCFS
     if (strcmp(filesystemType, "auto") == 0) {
        FILE *f = fopen ("/proc/filesystems", "r");
 
@@ -189,7 +190,9 @@ mount_one(char *blockDevice, char *directory, char *filesystemType,
            }
        }
        fclose (f);
-    } else {
+    } else
+#endif
+    {
        status = do_mount (blockDevice, directory, filesystemType,
                        flags | MS_MGC_VAL, string_flags, useMtab, 
                        fakeIt, mtab_opts);
index a38ef86fb59b2d73fae1d28b295a1b8bf2e908a4..81bff18e7d95d8f65fc8a00650c9edfedec3d26d 100644 (file)
--- a/utility.c
+++ b/utility.c
 #include <unistd.h>
 #include <ctype.h>
 
-#ifdef BB_MTAB
-const char mtab_file[] = "/etc/mtab";
-#else
 #if defined BB_MOUNT || defined BB_UMOUNT || defined BB_DF
+#  if defined BB_FEATURE_USE_PROCFS
 const char mtab_file[] = "/proc/mounts";
-#endif
+#  else
+#    if defined BB_MTAB
+const char mtab_file[] = "/etc/mtab";
+#    else
+#      error With (BB_MOUNT||BB_UMOUNT||BB_DF) defined, you must define either BB_MTAB or BB_FEATURE_USE_PROCFS
+#    endif
+#  endif
 #endif
 
 
@@ -56,6 +60,9 @@ extern void usage(const char *usage)
 
 #if defined (BB_INIT) || defined (BB_PS)
 
+#if ! defined BB_FEATURE_USE_PROCFS
+#error Sorry, I depend on the /proc filesystem right now.
+#endif
 /* Returns kernel version encoded as major*65536 + minor*256 + patch,
  * so, for example,  to check if the kernel is greater than 2.2.11:
  *     if (get_kernel_revision() <= 2*65536+2*256+11) { <stuff> }