dmesg,klogd: make code more readable
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 16 Nov 2007 20:18:54 +0000 (20:18 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 16 Nov 2007 20:18:54 +0000 (20:18 -0000)
libbb: explain why we declare klogctl
libbb: move defs around so that order makes more sense

include/libbb.h
sysklogd/klogd.c
util-linux/dmesg.c

index 1adac8443759c28b3d2f4583ecf60e35c6c3675f..2593c3ad23b9c8f2102cf8beca08bb5475380e89 100644 (file)
@@ -26,7 +26,6 @@
 #include <stdarg.h>
 #include <stddef.h>
 #include <string.h>
-/* #include <strings.h> - said to be obsolete */
 #include <sys/poll.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <time.h>
 #include <unistd.h>
 #include <utime.h>
+/* Try to pull in PATH_MAX */
+#include <limits.h>
+#include <sys/param.h>
+#ifndef PATH_MAX
+#define PATH_MAX 256
+#endif
 
 #if ENABLE_SELINUX
 #include <selinux/selinux.h>
 #include "shadow_.h"
 #endif
 
-/* Try to pull in PATH_MAX */
-#include <limits.h>
-#include <sys/param.h>
-#ifndef PATH_MAX
-#define PATH_MAX 256
+#if defined(__GLIBC__) && __GLIBC__ < 2
+int vdprintf(int d, const char *format, va_list ap);
 #endif
+/* klogctl is in libc's klog.h, but we cheat and not #include that */
+int klogctl(int type, char *b, int len);
+/* This is declared here rather than #including <libgen.h> in order to avoid
+ * confusing the two versions of basename.  See the dirname/basename man page
+ * for details. */
+char *dirname(char *path);
+/* Include our own copy of struct sysinfo to avoid binary compatibility
+ * problems with Linux 2.4, which changed things.  Grumble, grumble. */
+struct sysinfo {
+       long uptime;                    /* Seconds since boot */
+       unsigned long loads[3];         /* 1, 5, and 15 minute load averages */
+       unsigned long totalram;         /* Total usable main memory size */
+       unsigned long freeram;          /* Available memory size */
+       unsigned long sharedram;        /* Amount of shared memory */
+       unsigned long bufferram;        /* Memory used by buffers */
+       unsigned long totalswap;        /* Total swap space size */
+       unsigned long freeswap;         /* swap space still available */
+       unsigned short procs;           /* Number of current processes */
+       unsigned short pad;                     /* Padding needed for m68k */
+       unsigned long totalhigh;        /* Total high memory size */
+       unsigned long freehigh;         /* Available high memory size */
+       unsigned int mem_unit;          /* Memory unit size in bytes */
+       char _f[20 - 2*sizeof(long) - sizeof(int)]; /* Padding: libc5 uses this.. */
+};
+int sysinfo(struct sysinfo* info);
+
 
-/* Tested to work correctly (IIRC :]) */
+/* Tested to work correctly with all int types (IIRC :]) */
 #define MAXINT(T) (T)( \
        ((T)-1) > 0 \
        ? (T)-1 \
        )
 
 /* Large file support */
-/* Note that CONFIG_LFS forces bbox to be built with all common ops
+/* Note that CONFIG_LFS=y forces bbox to be built with all common ops
  * (stat, lseek etc) mapped to "largefile" variants by libc.
  * Practically it means that open() automatically has O_LARGEFILE added
  * and all filesize/file_offset parameters and struct members are "large"
 #endif
 #endif
 
-
 #if defined(__GLIBC__)
 /* glibc uses __errno_location() to get a ptr to errno */
 /* We can just memorize it once - no multithreading in busybox :) */
@@ -176,33 +203,6 @@ extern int *const bb_errno;
 #define errno (*bb_errno)
 #endif
 
-#if defined(__GLIBC__) && __GLIBC__ < 2
-int vdprintf(int d, const char *format, va_list ap);
-#endif
-// This is declared here rather than #including <libgen.h> in order to avoid
-// confusing the two versions of basename.  See the dirname/basename man page
-// for details.
-char *dirname(char *path);
-/* Include our own copy of struct sysinfo to avoid binary compatibility
- * problems with Linux 2.4, which changed things.  Grumble, grumble. */
-struct sysinfo {
-       long uptime;                    /* Seconds since boot */
-       unsigned long loads[3];         /* 1, 5, and 15 minute load averages */
-       unsigned long totalram;         /* Total usable main memory size */
-       unsigned long freeram;          /* Available memory size */
-       unsigned long sharedram;        /* Amount of shared memory */
-       unsigned long bufferram;        /* Memory used by buffers */
-       unsigned long totalswap;        /* Total swap space size */
-       unsigned long freeswap;         /* swap space still available */
-       unsigned short procs;           /* Number of current processes */
-       unsigned short pad;                     /* Padding needed for m68k */
-       unsigned long totalhigh;        /* Total high memory size */
-       unsigned long freehigh;         /* Available high memory size */
-       unsigned int mem_unit;          /* Memory unit size in bytes */
-       char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
-};
-int sysinfo(struct sysinfo* info);
-
 unsigned long long monotonic_us(void);
 unsigned monotonic_sec(void);
 
@@ -788,7 +788,6 @@ extern int set_loop(char **devname, const char *file, unsigned long long offset)
 //TODO: pass buf pointer or return allocated buf (avoid statics)?
 char *bb_askpass(int timeout, const char * prompt);
 int bb_ask_confirmation(void);
-int klogctl(int type, char * b, int len);
 
 extern int bb_parse_mode(const char* s, mode_t* theMode);
 
index 11642461dde2caa23056acc2c82f5423d7c4ed04..72f3b559ca928c712d6b16cf61cd45eac438ec43 100644 (file)
 static void klogd_signal(int sig ATTRIBUTE_UNUSED)
 {
        klogctl(7, NULL, 0);
-       klogctl(0, 0, 0);
-       syslog(LOG_NOTICE, "Kernel log daemon exiting");
+       klogctl(0, NULL, 0);
+       syslog(LOG_NOTICE, "klogd: exiting");
        exit(EXIT_SUCCESS);
 }
 
-#define OPT_LEVEL        1
-#define OPT_FOREGROUND   2
-
-#define KLOGD_LOGBUF_SIZE BUFSIZ
 #define log_buffer bb_common_bufsiz1
+enum {
+       KLOGD_LOGBUF_SIZE = sizeof(log_buffer),
+       OPT_LEVEL      = (1 << 0),
+       OPT_FOREGROUND = (1 << 1),
+};
 
 int klogd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int klogd_main(int argc, char **argv)
index 90b327b4c91f7ad8712e88b00b9cc757cfff099a..cdd385ede459317cb01a6bc24e35f2f14777c865 100644 (file)
 int dmesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int dmesg_main(int argc, char **argv)
 {
+       int len;
+       char *buf;
        char *size, *level;
        int flags = getopt32(argv, "cs:n:", &size, &level);
 
        if (flags & 4) {
                if (klogctl(8, NULL, xatoul_range(level, 0, 10)))
                        bb_perror_msg_and_die("klogctl");
-       } else {
-               int len;
-               char *buf;
-
-               len = (flags & 2) ? xatoul_range(size, 2, INT_MAX) : 16384;
-               buf = xmalloc(len);
-               len = klogctl(3 + (flags & 1), buf, len);
-               if (len < 0)
-                       bb_perror_msg_and_die("klogctl");
-
-               // Skip <#> at the start of lines, and make sure we end with a newline.
-
-               if (ENABLE_FEATURE_DMESG_PRETTY) {
-                       int last = '\n';
-                       int in;
+               return EXIT_SUCCESS;
+       }
 
-                       for (in = 0; in<len;) {
-                               if (last == '\n' && buf[in] == '<') in += 3;
-                               else bb_putchar(last = buf[in++]);
+       len = (flags & 2) ? xatoul_range(size, 2, INT_MAX) : 16384;
+       buf = xmalloc(len);
+       len = klogctl(3 + (flags & 1), buf, len);
+       if (len < 0)
+               bb_perror_msg_and_die("klogctl");
+       if (len == 0)
+               return EXIT_SUCCESS;
+
+       /* Skip <#> at the start of lines, and make sure we end with a newline. */
+
+       if (ENABLE_FEATURE_DMESG_PRETTY) {
+               int last = '\n';
+               int in = 0;
+
+               do {
+                       if (last == '\n' && buf[in] == '<')
+                               in += 3;
+                       else {
+                               last = buf[in++];
+                               bb_putchar(last);
                        }
-                       if (last != '\n') bb_putchar('\n');
-               } else {
-                       write(1,buf,len);
-                       if (len && buf[len-1]!='\n') bb_putchar('\n');
-               }
-
-               if (ENABLE_FEATURE_CLEAN_UP) free(buf);
+               } while (in < len);
+               if (last != '\n')
+                       bb_putchar('\n');
+       } else {
+               full_write(STDOUT_FILENO, buf, len);
+               if (buf[len-1] != '\n')
+                       bb_putchar('\n');
        }
 
-       return 0;
+       if (ENABLE_FEATURE_CLEAN_UP) free(buf);
+
+       return EXIT_SUCCESS;
 }