From d591a360d39f9bca3479b913fe4c5773965d18cf Mon Sep 17 00:00:00 2001 From: Bernhard Reutner-Fischer Date: Sun, 20 Aug 2006 17:35:13 +0000 Subject: [PATCH] - merge -r15463:15564 from busybox_scratch branch through these changesets: ------------------------------------------------------------------------ r15465 | aldot | 2006-06-21 20:48:06 +0200 (Wed, 21 Jun 2006) | 3 lines - use CONFIG_BUSYBOX_EXEC_PATH as before it one was broken by a recent revert. - use xchdir() since all is invain if it fails there anyways, supposedly ------------------------------------------------------------------------ r15466 | aldot | 2006-06-21 20:55:16 +0200 (Wed, 21 Jun 2006) | 2 lines - adjust docs to take CONFIG_BUSYBOX_EXEC_PATH into account. ------------------------------------------------------------------------ r15467 | aldot | 2006-06-21 21:31:24 +0200 (Wed, 21 Jun 2006) | 18 lines - partial fallout of my TREE_USED touchup against gcc-4.2: rip unused vars, save s 144 bytes text data bss dec hex filename 862434 10156 645924 1518514 172bb2 busybox.old 862322 10156 645892 1518370 172b22 busybox function old new delta z_len 4 - -4 textend 4 - -4 part_nb 4 - -4 insize 4 - -4 ifile_size 4 - -4 do_link 4 - -4 new_text 70 60 -10 ipaddr_list_link 33 23 -10 gzip_main 898 822 -76 ------------------------------------------------------------------------------ (add/remove: 0/6 grow/shrink: 0/3 up/down: 0/-120) Total: -120 bytes ------------------------------------------------------------------------ r15468 | aldot | 2006-06-21 21:43:05 +0200 (Wed, 21 Jun 2006) | 19 lines - remove useless global exports function old new delta rpm_main 940 1601 +661 rpm_getstring 107 112 +5 rpm_getint 148 153 +5 loop_through_files 103 106 +3 fileaction_dobackup 115 113 -2 fileaction_list 5 - -5 rpm_getcount 42 - -42 extract_cpio_gz 161 - -161 rpm_gettags 504 - -504 ------------------------------------------------------------------------------ (add/remove: 0/4 grow/shrink: 4/1 up/down: 674/-714) Total: -40 bytes text data bss dec hex filename 862322 10156 645892 1518370 172b22 busybox.old 862290 10156 645892 1518338 172b02 busybox ------------------------------------------------------------------------ r15555 | aldot | 2006-06-30 14:10:11 +0200 (Fri, 30 Jun 2006) | 22 lines - shrink syslog a little bit, move a big buffer (for 'line') off the bss, fold s emaphore stuff into single caller manually. stats: function old new delta logMessage 395 427 +32 message 1245 1257 +12 opts - 4 +4 small 1 - -1 local_logging 4 - -4 doRemoteLog 4 - -4 circular_logging 4 - -4 syslogd_main 1299 1285 -14 static.res 36 16 -20 .rodata 186650 186586 -64 static.line 1025 - -1025 ------------------------------------------------------------------------------ (add/remove: 1/5 grow/shrink: 2/3 up/down: 48/-1136) Total: -1088 bytes cow@s37:~/src/busybox_scratch$ size sysklogd/syslogd.o{.orig,} text data bss dec hex filename 3723 348 5242 9313 2461 sysklogd/syslogd.o.orig 3697 348 4188 8233 2029 sysklogd/syslogd.o ============================================================================== Overall bloatcheck for the changeset mentioned above: function old new delta rpm_main 953 1608 +655 logMessage 395 427 +32 message 1245 1257 +12 opts - 4 +4 rpm_getstring 107 110 +3 rpm_getint 148 151 +3 loop_through_files 103 104 +1 small 1 - -1 fileaction_dobackup 115 113 -2 z_len 4 - -4 textend 4 - -4 part_nb 4 - -4 local_logging 4 - -4 insize 4 - -4 ifile_size 4 - -4 do_link 4 - -4 doRemoteLog 4 - -4 circular_logging 4 - -4 fileaction_list 5 - -5 new_text 70 60 -10 ipaddr_list_link 33 23 -10 clear_bufs 31 21 -10 syslogd_main 1287 1273 -14 builtin_help 190 176 -14 static.res 36 16 -20 builtin_source 229 199 -30 rpm_getcount 42 - -42 gzip_main 842 786 -56 .rodata 227176 227112 -64 lash_main 609 527 -82 busy_loop 3883 3739 -144 extract_cpio_gz 155 - -155 rpm_gettags 501 - -501 static.line 1025 - -1025 ------------------------------------------------------------------------------ (add/remove: 1/15 grow/shrink: 6/12 up/down: 710/-2221) Total: -1511 bytes --- INSTALL | 6 +- archival/gzip.c | 14 ++-- archival/rpm.c | 43 +++++------ coreutils/env.c | 13 ++-- coreutils/uudecode.c | 3 +- docs/busybox.net/FAQ.html | 10 ++- editors/vi.c | 15 ++-- libbb/vfork_daemon_rexec.c | 4 +- miscutils/less.c | 7 -- miscutils/makedevs.c | 3 +- networking/inetd.c | 4 +- networking/libiproute/iplink.c | 3 - shell/lash.c | 126 ++++++++++++++------------------- sysklogd/syslogd.c | 98 ++++++++++--------------- 14 files changed, 138 insertions(+), 211 deletions(-) diff --git a/INSTALL b/INSTALL index 731e58e41..6644481a3 100644 --- a/INSTALL +++ b/INSTALL @@ -32,8 +32,10 @@ any built-in busybox applets directly, without looking for external programs by that name. Supplying an empty command path (as above) means the only commands busybox can find are the built-in ones. -(Note that the standalone shell currently requires /proc/self/exe to -launch new applets.) +Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH +to be set appropriately, depending on whether or not /proc/self/exe is +available or not. If you do not have /proc, then point that config option +to the location of your busybox binary, usually /bin/busybox. Configuring Busybox: ==================== diff --git a/archival/gzip.c b/archival/gzip.c index 0962a00a7..37fefbf6a 100644 --- a/archival/gzip.c +++ b/archival/gzip.c @@ -263,15 +263,14 @@ DECLARE(ush, tab_prefix, 1L << BITS); static int foreground; /* set if program run in foreground */ static int method = DEFLATED; /* compression method */ static int exit_code = OK; /* program exit code */ -static int part_nb; /* number of parts in .gz file */ static long time_stamp; /* original time stamp (modification time) */ -static long ifile_size; /* input file size, -1 for devices (debug only) */ static char z_suffix[MAX_SUFFIX + 1]; /* default suffix (can be set with --suffix) */ -static int z_len; /* strlen(z_suffix) */ static int ifd; /* input file descriptor */ static int ofd; /* output file descriptor */ +#ifdef DEBUG static unsigned insize; /* valid bytes in inbuf */ +#endif static unsigned outcnt; /* bytes in output buffer */ static uint32_t *crc_32_tab; @@ -302,7 +301,9 @@ static void abort_gzip(int ATTRIBUTE_UNUSED ignored) static void clear_bufs(void) { outcnt = 0; +#ifdef DEBUG insize = 0; +#endif bytes_in = 0L; } @@ -1177,7 +1178,6 @@ int gzip_main(int argc, char **argv) #endif strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix) - 1); - z_len = strlen(z_suffix); /* Allocate all global buffers (for DYN_ALLOC option) */ ALLOC(uch, inbuf, INBUFSIZ + INBUF_EXTRA); @@ -1188,13 +1188,11 @@ int gzip_main(int argc, char **argv) /* Initialise the CRC32 table */ crc_32_tab = crc32_filltable(0); - + clear_bufs(); - part_nb = 0; if (optind == argc) { time_stamp = 0; - ifile_size = -1L; zip(STDIN_FILENO, STDOUT_FILENO); } else { int i; @@ -1205,7 +1203,6 @@ int gzip_main(int argc, char **argv) clear_bufs(); if (strcmp(argv[i], "-") == 0) { time_stamp = 0; - ifile_size = -1L; inFileNum = STDIN_FILENO; outFileNum = STDOUT_FILENO; } else { @@ -1213,7 +1210,6 @@ int gzip_main(int argc, char **argv) if (fstat(inFileNum, &statBuf) < 0) bb_perror_msg_and_die("%s", argv[i]); time_stamp = statBuf.st_ctime; - ifile_size = statBuf.st_size; if (!tostdout) { path = xmalloc(strlen(argv[i]) + 4); diff --git a/archival/rpm.c b/archival/rpm.c index 7b27c0250..d399e0ea2 100644 --- a/archival/rpm.c +++ b/archival/rpm.c @@ -70,17 +70,15 @@ static void *map; static rpm_index **mytags; static int tagcount; -void extract_cpio_gz(int fd); -rpm_index **rpm_gettags(int fd, int *num_tags); -int bsearch_rpmtag(const void *key, const void *item); -char *rpm_getstring(int tag, int itemindex); -int rpm_getint(int tag, int itemindex); -int rpm_getcount(int tag); -void exec_script(int progtag, int datatag, char *prefix); -void fileaction_dobackup(char *filename, int fileref); -void fileaction_setowngrp(char *filename, int fileref); -void fileaction_list(char *filename, int itemno); -void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref)); +static void extract_cpio_gz(int fd); +static rpm_index **rpm_gettags(int fd, int *num_tags); +static int bsearch_rpmtag(const void *key, const void *item); +static char *rpm_getstring(int tag, int itemindex); +static int rpm_getint(int tag, int itemindex); +static int rpm_getcount(int tag); +static void fileaction_dobackup(char *filename, int fileref); +static void fileaction_setowngrp(char *filename, int fileref); +static void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref)); int rpm_main(int argc, char **argv) { @@ -169,7 +167,7 @@ int rpm_main(int argc, char **argv) return 0; } -void extract_cpio_gz(int fd) { +static void extract_cpio_gz(int fd) { archive_handle_t *archive_handle; unsigned char magic[2]; @@ -196,7 +194,7 @@ void extract_cpio_gz(int fd) { } -rpm_index **rpm_gettags(int fd, int *num_tags) +static rpm_index **rpm_gettags(int fd, int *num_tags) { rpm_index **tags = xzalloc(200 * sizeof(struct rpmtag *)); /* We should never need mode than 200, and realloc later */ int pass, tagindex = 0; @@ -235,14 +233,14 @@ rpm_index **rpm_gettags(int fd, int *num_tags) return tags; /* All done, leave the file at the start of the gzipped cpio archive */ } -int bsearch_rpmtag(const void *key, const void *item) +static int bsearch_rpmtag(const void *key, const void *item) { int *tag = (int *)key; rpm_index **tmp = (rpm_index **) item; return (*tag - tmp[0]->tag); } -int rpm_getcount(int tag) +static int rpm_getcount(int tag) { rpm_index **found; found = bsearch(&tag, mytags, tagcount, sizeof(struct rpmtag *), bsearch_rpmtag); @@ -250,7 +248,7 @@ int rpm_getcount(int tag) else return found[0]->count; } -char *rpm_getstring(int tag, int itemindex) +static char *rpm_getstring(int tag, int itemindex) { rpm_index **found; found = bsearch(&tag, mytags, tagcount, sizeof(struct rpmtag *), bsearch_rpmtag); @@ -263,7 +261,7 @@ char *rpm_getstring(int tag, int itemindex) } else return NULL; } -int rpm_getint(int tag, int itemindex) +static int rpm_getint(int tag, int itemindex) { rpm_index **found; int n, *tmpint; @@ -284,7 +282,7 @@ int rpm_getint(int tag, int itemindex) } else return -1; } -void fileaction_dobackup(char *filename, int fileref) +static void fileaction_dobackup(char *filename, int fileref) { struct stat oldfile; int stat_res; @@ -301,7 +299,7 @@ void fileaction_dobackup(char *filename, int fileref) } } -void fileaction_setowngrp(char *filename, int fileref) +static void fileaction_setowngrp(char *filename, int fileref) { int uid, gid; uid = bb_xgetpwnam(rpm_getstring(RPMTAG_FILEUSERNAME, fileref)); @@ -309,12 +307,7 @@ void fileaction_setowngrp(char *filename, int fileref) chown (filename, uid, gid); } -void fileaction_list(char *filename, int ATTRIBUTE_UNUSED fileref) -{ - printf("%s\n", filename); -} - -void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref)) +static void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref)) { int count = 0; while (rpm_getstring(filetag, count)) { diff --git a/coreutils/env.c b/coreutils/env.c index eb1f0b268..4cdbeae6a 100644 --- a/coreutils/env.c +++ b/coreutils/env.c @@ -29,14 +29,9 @@ * - use bb_default_error_retval */ - -#include -#include -#include -#include -#include -#include /* struct option */ #include "busybox.h" +#include +#include /* struct option */ #if ENABLE_FEATURE_ENV_LONG_OPTIONS static const struct option env_long_options[] = { @@ -50,7 +45,7 @@ int env_main(int argc, char** argv) { static char *cleanenv[1] = { NULL }; - char **ep, *p; + char **ep; unsigned long opt; llist_t *unset_env = NULL; extern char **environ; @@ -77,7 +72,7 @@ int env_main(int argc, char** argv) } } - while (*argv && ((p = strchr(*argv, '=')) != NULL)) { + while (*argv && (strchr(*argv, '=') != NULL)) { if (putenv(*argv) < 0) { bb_perror_msg_and_die("putenv"); } diff --git a/coreutils/uudecode.c b/coreutils/uudecode.c index 6050c0af7..2ec4306d0 100644 --- a/coreutils/uudecode.c +++ b/coreutils/uudecode.c @@ -129,9 +129,8 @@ int uudecode_main(int argc, char **argv) FILE *src_stream; char *outname = NULL; char *line; - int opt; - opt = bb_getopt_ulflags(argc, argv, "o:", &outname); + bb_getopt_ulflags(argc, argv, "o:", &outname); if (optind == argc) { src_stream = stdin; diff --git a/docs/busybox.net/FAQ.html b/docs/busybox.net/FAQ.html index 34250a33e..fee207486 100644 --- a/docs/busybox.net/FAQ.html +++ b/docs/busybox.net/FAQ.html @@ -88,9 +88,13 @@ have additions to this FAQ document, we would love to add them, the command line "PATH= ./busybox ash". This will blank your command path and run busybox as your command shell, so the only commands it can find (without an explicit path such as /bin/ls) are the built-in busybox ones. - This is another good way to see what's built into busybox. (Note that the - standalone shell is dependent on the existence of /proc/self/exe, so before - using it in a chroot environment you must mount /proc.) + This is another good way to see what's built into busybox. + Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH + to be set appropriately, depending on whether or not /proc/self/exe is + available or not. If you do not have /proc, then point that config option + to the location of your busybox binary, usually /bin/busybox. + (So if you set it to /proc/self/exe, and happen to be able to chroot into + your rootfs, you must mount /proc beforehand.)


diff --git a/editors/vi.c b/editors/vi.c index 593dc8520..3cbf6937d 100644 --- a/editors/vi.c +++ b/editors/vi.c @@ -116,7 +116,7 @@ static Byte *status_buffer; // mesages to the user static int have_status_msg; // is default edit status needed? static int last_status_cksum; // hash of current status line static Byte *cfn; // previous, current, and next file name -static Byte *text, *end, *textend; // pointers to the user data in memory +static Byte *text, *end; // pointers to the user data in memory static Byte *screen; // pointer to the virtual screen buffer static int screensize; // and its size static Byte *screenbegin; // index into text[], of top line on the screen @@ -582,7 +582,7 @@ static void colon(Byte * buf) { Byte c, *orig_buf, *buf1, *q, *r; Byte *fn, cmd[BUFSIZ], args[BUFSIZ]; - int i, l, li, ch, st, b, e; + int i, l, li, ch, b, e; int useforce = FALSE, forced = FALSE; struct stat st_buf; @@ -606,7 +606,7 @@ static void colon(Byte * buf) if (*buf == ':') buf++; // move past the ':' - li = st = ch = i = 0; + li = ch = i = 0; b = e = -1; q = text; // assume 1,$ for the range r = end - 1; @@ -1075,14 +1075,13 @@ static void Hit_Return(void) //----- Synchronize the cursor to Dot -------------------------- static void sync_cursor(Byte * d, int *row, int *col) { - Byte *beg_cur; // begin and end of "d" line - Byte *beg_scr, *end_scr; // begin and end of screen + Byte *beg_cur; // begin and end of "d" line + Byte *end_scr; // begin and end of screen Byte *tp; int cnt, ro, co; beg_cur = begin_line(d); // first char of cur line - beg_scr = end_scr = screenbegin; // first char of screen end_scr = end_screen(); // last char of screen if (beg_cur < screenbegin) { @@ -1385,8 +1384,6 @@ static Byte *new_text(int size) text = (Byte *) xmalloc(size + 8); memset(text, '\0', size); // clear new text[] //text += 4; // leave some room for "oops" - textend = text + size - 1; - //textend -= 4; // leave some root for "oops" return (text); } @@ -1963,9 +1960,7 @@ static Byte *text_yank(Byte * p, Byte * q, int dest) // copy text into a registe static Byte what_reg(void) { Byte c; - int i; - i = 0; c = 'D'; // default to D-reg if (0 <= YDreg && YDreg <= 25) c = 'a' + (Byte) YDreg; diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c index 59a2287b0..7e4b0c097 100644 --- a/libbb/vfork_daemon_rexec.c +++ b/libbb/vfork_daemon_rexec.c @@ -33,7 +33,7 @@ void vfork_daemon_rexec(int nochdir, int noclose, setsid(); if (!nochdir) - chdir("/"); + xchdir("/"); if (!noclose && (fd = open(bb_dev_null, O_RDWR, 0)) != -1) { dup2(fd, STDIN_FILENO); @@ -44,7 +44,7 @@ void vfork_daemon_rexec(int nochdir, int noclose, } vfork_args = xcalloc(sizeof(char *), argc + 3); - vfork_args[a++] = "/bin/busybox"; + vfork_args[a++] = CONFIG_BUSYBOX_EXEC_PATH; while(*argv) { vfork_args[a++] = *argv; argv++; diff --git a/miscutils/less.c b/miscutils/less.c index 9dd9b9e56..c13d7b8a2 100644 --- a/miscutils/less.c +++ b/miscutils/less.c @@ -872,14 +872,12 @@ static void save_input_to_file(void) static void add_mark(void) { int letter; - int mark_line; clear_line(); printf("Mark: "); letter = tless_getch(); if (isalpha(letter)) { - mark_line = line_pos; /* If we exceed 15 marks, start overwriting previous ones */ if (num_marks == 14) @@ -927,19 +925,14 @@ static char opp_bracket(char bracket) switch (bracket) { case '{': case '[': return bracket + 2; - break; case '(': return ')'; - break; case '}': case ']': return bracket - 2; - break; case ')': return '('; - break; default: return 0; - break; } } diff --git a/miscutils/makedevs.c b/miscutils/makedevs.c index 0ebb0538f..70dfc4205 100644 --- a/miscutils/makedevs.c +++ b/miscutils/makedevs.c @@ -76,8 +76,7 @@ int makedevs_main(int argc, char **argv) int linenum = 0; int ret = EXIT_SUCCESS; - unsigned long flags; - flags = bb_getopt_ulflags(argc, argv, "d:", &line); + bb_getopt_ulflags(argc, argv, "d:", &line); if (line) table = xfopen(line, "r"); diff --git a/networking/inetd.c b/networking/inetd.c index 49ca7a36e..a17d28ebf 100644 --- a/networking/inetd.c +++ b/networking/inetd.c @@ -908,7 +908,6 @@ static void config (int sig ATTRIBUTE_UNUSED) { servtab_t *sep, *cp, **sepp; sigset_t omask; - int add; size_t n; char protoname[10]; @@ -923,7 +922,7 @@ static void config (int sig ATTRIBUTE_UNUSED) for (sep = servtab; sep; sep = sep->se_next) if (matchconf (sep, cp)) break; - add = 0; + if (sep != 0) { int i; @@ -958,7 +957,6 @@ static void config (int sig ATTRIBUTE_UNUSED) #endif sigprocmask(SIG_UNBLOCK, &omask, NULL); freeconfig (cp); - add = 1; } else { sep = enter (cp); } diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c index 1948efe37..d9f28374b 100644 --- a/networking/libiproute/iplink.c +++ b/networking/libiproute/iplink.c @@ -29,8 +29,6 @@ /* take from linux/sockios.h */ #define SIOCSIFNAME 0x8923 /* set interface name */ -static int do_link; - static int on_off(char *msg) { bb_error_msg("Error: argument of \"%s\" must be \"on\" or \"off\"", msg); @@ -336,7 +334,6 @@ static int do_set(int argc, char **argv) static int ipaddr_list_link(int argc, char **argv) { preferred_family = AF_PACKET; - do_link = 1; return ipaddr_list_or_flush(argc, argv, 0); } diff --git a/shell/lash.c b/shell/lash.c index eae949e18..fd6bea177 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -54,6 +54,9 @@ enum { ELSE_EXP_CONTEXT = 0x10 }; +#define LASH_OPT_DONE (1) +#define LASH_OPT_SAW_QUOTE (2) + #ifdef CONFIG_LASH_PIPE_N_REDIRECTS struct redir_struct { enum redir_type type; /* type of redirection */ @@ -154,7 +157,7 @@ static int shell_context; /* Type prompt trigger (PS1 or PS2) */ /* Globals that are static to this file */ static const char *cwd; -static char *local_pending_command = NULL; +static char *local_pending_command; static struct jobset job_list = { NULL, NULL }; static int argc; static char **argv; @@ -176,7 +179,7 @@ static inline void debug_printf(const char *format, ...) va_end(args); } #else -static inline void debug_printf(const char *format, ...) { } +static inline void debug_printf(const char ATTRIBUTE_UNUSED *format, ...) { } #endif /* @@ -304,12 +307,12 @@ static int builtin_fg_bg(struct child_prog *child) } /* built-in 'help' handler */ -static int builtin_help(struct child_prog *dummy) +static int builtin_help(struct child_prog ATTRIBUTE_UNUSED *dummy) { struct built_in_command *x; - printf("\nBuilt-in commands:\n"); - printf("-------------------\n"); + printf("\nBuilt-in commands:\n" + "-------------------\n"); for (x = bltins; x->cmd; x++) { if (x->descr==NULL) continue; @@ -320,7 +323,7 @@ static int builtin_help(struct child_prog *dummy) continue; printf("%s\t%s\n", x->cmd, x->descr); } - printf("\n\n"); + putchar('\n'); return EXIT_SUCCESS; } @@ -343,7 +346,7 @@ static int builtin_jobs(struct child_prog *child) /* built-in 'pwd' handler */ -static int builtin_pwd(struct child_prog *dummy) +static int builtin_pwd(struct child_prog ATTRIBUTE_UNUSED *dummy) { cwd = xgetcwd((char *)cwd); if (!cwd) @@ -386,7 +389,7 @@ static int builtin_export(struct child_prog *child) /* built-in 'read VAR' handler */ static int builtin_read(struct child_prog *child) { - int res = 0, len, newlen; + int res = 0, len; char *s; char string[MAX_READ]; @@ -397,16 +400,16 @@ static int builtin_read(struct child_prog *child) string[len++] = '='; string[len] = '\0'; fgets(&string[len], sizeof(string) - len, stdin); /* read string */ - newlen = strlen(string); - if(newlen > len) - string[--newlen] = '\0'; /* chomp trailing newline */ + res = strlen(string); + if (res > len) + string[--res] = '\0'; /* chomp trailing newline */ /* ** string should now contain "VAR=" ** copy it (putenv() won't do that, so we must make sure ** the string resides in a static buffer!) */ res = -1; - if((s = strdup(string))) + if ((s = strdup(string))) res = putenv(s); if (res) bb_perror_msg("read"); @@ -423,12 +426,8 @@ static int builtin_source(struct child_prog *child) FILE *input; int status; - if (child->argv[1] == NULL) - return EXIT_FAILURE; - - input = fopen(child->argv[1], "r"); + input = bb_wfopen(child->argv[1], "r"); if (!input) { - printf( "Couldn't open file '%s'\n", child->argv[1]); return EXIT_FAILURE; } @@ -635,7 +634,7 @@ static inline void setup_prompt_string(char **prompt_str) if (shell_context == 0) { free(PS1); PS1=xmalloc(strlen(cwd)+4); - sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# "); + sprintf(PS1, "%s %c ", cwd, ( geteuid() != 0 ) ? '$': '#'); *prompt_str = PS1; } else { *prompt_str = PS2; @@ -688,20 +687,18 @@ static int get_command(FILE * source, char *command) static char * strsep_space( char *string, int * ix) { - char *token; - /* Short circuit the trivial case */ if ( !string || ! string[*ix]) return NULL; /* Find the end of the token. */ - while( string[*ix] && !isspace(string[*ix]) ) { + while (string[*ix] && !isspace(string[*ix]) ) { (*ix)++; } /* Find the end of any whitespace trailing behind * the token and let that be part of the token */ - while( string[*ix] && isspace(string[*ix]) ) { + while (string[*ix] && (isspace)(string[*ix]) ) { (*ix)++; } @@ -710,9 +707,7 @@ static char * strsep_space( char *string, int * ix) return NULL; } - token = xstrndup(string, *ix); - - return token; + return xstrndup(string, *ix); } static int expand_arguments(char *command) @@ -721,7 +716,7 @@ static int expand_arguments(char *command) expand_t expand_result; char *tmpcmd, *cmd, *cmd_copy; char *src, *dst, *var; - const char *out_of_space = "out of space during expansion"; + const char * const out_of_space = "out of space during expansion"; int flags = GLOB_NOCHECK #ifdef GLOB_BRACE | GLOB_BRACE @@ -846,7 +841,7 @@ static int expand_arguments(char *command) num_skip_chars=1; } else { src=dst+1; - while(isalnum(*src) || *src=='_') src++; + while((isalnum)(*src) || *src=='_') src++; } if (src == NULL) { src = dst+dstlen; @@ -890,10 +885,9 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) char *command; char *return_command = NULL; char *src, *buf; - int argc_l = 0; - int done = 0; + int argc_l; + int flag; int argv_alloced; - int saw_quote = 0; char quote = '\0'; struct child_prog *prog; #ifdef CONFIG_LASH_PIPE_N_REDIRECTS @@ -902,8 +896,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) #endif /* skip leading white space */ - while (**command_ptr && isspace(**command_ptr)) - (*command_ptr)++; + *command_ptr = skip_whitespace(*command_ptr); /* this handles empty lines or leading '#' characters */ if (!**command_ptr || (**command_ptr == '#')) { @@ -937,9 +930,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) prog->argv = xmalloc(sizeof(*prog->argv) * argv_alloced); prog->argv[0] = job->cmdbuf; + flag = argc_l = 0; buf = command; src = *command_ptr; - while (*src && !done) { + while (*src && !(flag & LASH_OPT_DONE)) { if (quote == *src) { quote = '\0'; } else if (quote) { @@ -960,7 +954,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) *src == ']') *buf++ = '\\'; *buf++ = *src; } else if (isspace(*src)) { - if (*prog->argv[argc_l] || saw_quote) { + if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE) { buf++, argc_l++; /* +1 here leaves room for the NULL which ends argv */ if ((argc_l + 1) == argv_alloced) { @@ -970,21 +964,21 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) argv_alloced); } prog->argv[argc_l] = buf; - saw_quote = 0; + flag ^= LASH_OPT_SAW_QUOTE; } } else switch (*src) { case '"': case '\'': quote = *src; - saw_quote = 1; + flag |= LASH_OPT_SAW_QUOTE; break; case '#': /* comment */ if (*(src-1)== '$') *buf++ = *src; else - done = 1; + flag |= LASH_OPT_DONE; break; #ifdef CONFIG_LASH_PIPE_N_REDIRECTS @@ -1027,8 +1021,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) /* This isn't POSIX sh compliant. Oh well. */ chptr = src; - while (isspace(*chptr)) - chptr++; + chptr = skip_whitespace(chptr); if (!*chptr) { bb_error_msg("file name expected after %c", *(src-1)); @@ -1047,13 +1040,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) case '|': /* pipe */ /* finish this command */ - if (*prog->argv[argc_l] || saw_quote) + if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE) argc_l++; if (!argc_l) { - bb_error_msg("empty command in pipe"); - free_job(job); - job->num_progs=0; - return 1; + goto empty_command_in_pipe; } prog->argv[argc_l] = NULL; @@ -1073,10 +1063,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) prog->argv[0] = ++buf; src++; - while (*src && isspace(*src)) - src++; + src = skip_whitespace(src); if (!*src) { +empty_command_in_pipe: bb_error_msg("empty command in pipe"); free_job(job); job->num_progs=0; @@ -1090,9 +1080,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) #ifdef CONFIG_LASH_JOB_CONTROL case '&': /* background */ *inbg = 1; + /* fallthrough */ #endif case ';': /* multiple commands */ - done = 1; + flag |= LASH_OPT_DONE; return_command = *command_ptr + (src - *command_ptr) + 1; break; @@ -1113,7 +1104,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg) src++; } - if (*prog->argv[argc_l] || saw_quote) { + if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE) { argc_l++; } if (!argc_l) { @@ -1295,7 +1286,7 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2]) signal(SIGTTOU, SIG_DFL); signal(SIGCHLD, SIG_DFL); - // Close all open filehandles. + /* Close all open filehandles. */ while(close_me_list) close((long)llist_pop(&close_me_list)); if (outpipe[1]!=-1) { @@ -1512,14 +1503,13 @@ static inline void setup_job_control(void) int lash_main(int argc_l, char **argv_l) { - int opt, interactive=FALSE; + unsigned long opt; FILE *input = stdin; argc = argc_l; argv = argv_l; /* These variables need re-initializing when recursing */ last_jobid = 0; - local_pending_command = NULL; close_me_list = NULL; job_list.head = NULL; job_list.fg = NULL; @@ -1532,27 +1522,18 @@ int lash_main(int argc_l, char **argv_l) llist_add_to(&close_me_list, (void *)(long)fileno(prof_input)); /* Now run the file */ busy_loop(prof_input); - fclose(prof_input); + bb_fclose_nonstdin(prof_input); llist_pop(&close_me_list); } } - while ((opt = getopt(argc_l, argv_l, "cxi")) > 0) { - switch (opt) { - case 'c': - input = NULL; - if (local_pending_command != 0) - bb_error_msg_and_die("multiple -c arguments"); - local_pending_command = xstrdup(argv[optind]); - optind++; - argv = argv+optind; - break; - case 'i': - interactive++; - break; - default: - bb_show_usage(); - } + opt = bb_getopt_ulflags(argc_l, argv_l, "+ic:", &local_pending_command); +#define LASH_OPT_i (1<<0) +#define LASH_OPT_c (1<<2) + if (opt & LASH_OPT_c) { + input = NULL; + optind++; + argv += optind; } /* A shell is interactive if the `-i' flag was given, or if all of * the following conditions are met: @@ -1564,14 +1545,15 @@ int lash_main(int argc_l, char **argv_l) if (argv[optind]==NULL && input==stdin && isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) { - interactive++; + opt |= LASH_OPT_i; } setup_job_control(); - if (interactive) { + if (opt & LASH_OPT_i) { /* Looks like they want an interactive shell */ if (!ENABLE_FEATURE_SH_EXTRA_QUIET) { - printf( "\n\n%s Built-in shell (lash)\n", BB_BANNER); - printf( "Enter 'help' for a list of built-in commands.\n\n"); + printf("\n\n%s Built-in shell (lash)\n" + "Enter 'help' for a list of built-in commands.\n\n", + BB_BANNER); } } else if (!local_pending_command && argv[optind]) { //printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]); diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 87313af43..fc3845606 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -57,14 +57,14 @@ static char *RemoteHost; /* what port to log to? */ static int RemotePort = 514; -/* To remote log or not to remote log, that is the question. */ -static int doRemoteLog = FALSE; -static int local_logging = FALSE; #endif -/* Make loging output smaller. */ -static bool small = false; - +/* options */ +static unsigned opts; +#define SYSLOG_OPT_small (1) +#define SYSLOG_OPT_remotelog (2) +#define SYSLOG_OPT_locallog (4) +#define SYSLOG_OPT_circularlog (8) #define MAXLINE 1024 /* maximum line length */ @@ -98,28 +98,6 @@ static struct sembuf SMwdn[3] = { {0, 0}, {1, 0}, {1, +1} }; // set SMwdn static int shmid = -1; // ipc shared memory id static int s_semid = -1; // ipc semaphore id static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size -static int circular_logging = FALSE; - -/* - * sem_up - up()'s a semaphore. - */ -static inline void sem_up(int semid) -{ - if (semop(semid, SMwup, 1) == -1) { - bb_perror_msg_and_die("semop[SMwup]"); - } -} - -/* - * sem_down - down()'s a semaphore - */ -static inline void sem_down(int semid) -{ - if (semop(semid, SMwdn, 3) == -1) { - bb_perror_msg_and_die("semop[SMwdn]"); - } -} - static void ipcsyslog_cleanup(void) { @@ -169,8 +147,11 @@ static void ipcsyslog_init(void) static void circ_message(const char *msg) { int l = strlen(msg) + 1; /* count the whole message w/ '\0' included */ + const char * const fail_msg = "Can't find the terminator token%s?\n"; - sem_down(s_semid); + if (semop(s_semid, SMwdn, 3) == -1) { + bb_perror_msg_and_die("SMwdn"); + } /* * Circular Buffer Algorithm: @@ -220,7 +201,7 @@ static void circ_message(const char *msg) /* Note: HEAD is only used to "retrieve" messages, it's not used when writing messages into our buffer */ } else { /* show an error message to know we messed up? */ - printf("Weird! Can't find the terminator token?\n"); + printf(fail_msg,""); buf->head = 0; } } @@ -256,13 +237,15 @@ static void circ_message(const char *msg) /* we need to place the TAIL at the end of the message */ buf->tail = k + 1; } else { - printf - ("Weird! Can't find the terminator token from the beginning?\n"); + printf(fail_msg, " from the beginning"); buf->head = buf->tail = 0; /* reset buffer, since it's probably corrupted */ } } - sem_up(s_semid); + if (semop(s_semid, SMwup, 1) == -1) { + bb_perror_msg_and_die("SMwup"); + } + } #endif /* CONFIG_FEATURE_IPC_SYSLOG */ @@ -280,7 +263,7 @@ static void message(char *fmt, ...) fl.l_len = 1; #ifdef CONFIG_FEATURE_IPC_SYSLOG - if ((circular_logging == TRUE) && (buf != NULL)) { + if ((opts & SYSLOG_OPT_circularlog) && (buf != NULL)) { char b[1024]; va_start(arguments, fmt); @@ -295,8 +278,8 @@ static void message(char *fmt, ...) O_NONBLOCK)) >= 0) { fl.l_type = F_WRLCK; fcntl(fd, F_SETLKW, &fl); -#ifdef CONFIG_FEATURE_ROTATE_LOGFILE - if ( logFileSize > 0 ) { + + if (ENABLE_FEATURE_ROTATE_LOGFILE && logFileSize > 0 ) { struct stat statf; int r = fstat(fd, &statf); if( !r && (statf.st_mode & S_IFREG) @@ -324,7 +307,7 @@ static void message(char *fmt, ...) } } } -#endif + va_start(arguments, fmt); vdprintf(fd, fmt, arguments); va_end(arguments); @@ -364,10 +347,7 @@ static void logMessage(int pri, char *msg) { time_t now; char *timestamp; - static char res[20]; -#ifdef CONFIG_FEATURE_REMOTE_LOG - static char line[MAXLINE + 1]; -#endif + char res[20]; CODE *c_pri, *c_fac; if (pri != 0) { @@ -396,7 +376,8 @@ static void logMessage(int pri, char *msg) /* todo: supress duplicates */ #ifdef CONFIG_FEATURE_REMOTE_LOG - if (doRemoteLog == TRUE) { + if (opts & SYSLOG_OPT_remotelog) { + char line[MAXLINE + 1]; /* trying connect the socket */ if (-1 == remotefd) { init_RemoteLog(); @@ -407,7 +388,7 @@ static void logMessage(int pri, char *msg) now = 1; snprintf(line, sizeof(line), "<%d>%s", pri, msg); - retry: +retry: /* send message to remote logger */ if(( -1 == sendto(remotefd, line, strlen(line), 0, (struct sockaddr *) &remoteaddr, @@ -420,11 +401,11 @@ static void logMessage(int pri, char *msg) } } - if (local_logging == TRUE) + if (opts & SYSLOG_OPT_locallog) #endif { /* now spew out the message to wherever it is supposed to go */ - if (small) + if (opts & SYSLOG_OPT_small) message("%s %s\n", timestamp, msg); else message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); @@ -435,9 +416,8 @@ static void quit_signal(int sig) { logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); unlink(lfile); -#ifdef CONFIG_FEATURE_IPC_SYSLOG - ipcsyslog_cleanup(); -#endif + if (ENABLE_FEATURE_IPC_SYSLOG) + ipcsyslog_cleanup(); exit(TRUE); } @@ -531,17 +511,13 @@ static void doSyslogd(void) if (chmod(lfile, 0666) < 0) { bb_perror_msg_and_die("Could not set permission on " _PATH_LOG); } -#ifdef CONFIG_FEATURE_IPC_SYSLOG - if (circular_logging == TRUE) { + if (ENABLE_FEATURE_IPC_SYSLOG && opts & SYSLOG_OPT_circularlog) { ipcsyslog_init(); } -#endif -#ifdef CONFIG_FEATURE_REMOTE_LOG - if (doRemoteLog == TRUE) { + if (ENABLE_FEATURE_REMOTE_LOG && opts & SYSLOG_OPT_remotelog) { init_RemoteLog(); } -#endif logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER ); @@ -613,10 +589,10 @@ int syslogd_main(int argc, char **argv) RemotePort = atoi(p + 1); *p = '\0'; } - doRemoteLog = TRUE; + opts |= SYSLOG_OPT_remotelog; break; case 'L': - local_logging = TRUE; + opts |= SYSLOG_OPT_locallog; break; #endif #ifdef CONFIG_FEATURE_IPC_SYSLOG @@ -627,22 +603,20 @@ int syslogd_main(int argc, char **argv) shm_size = buf_size * 1024; } } - circular_logging = TRUE; + opts |= SYSLOG_OPT_circularlog; break; #endif case 'S': - small = true; + opts |= SYSLOG_OPT_small; break; default: bb_show_usage(); } } -#ifdef CONFIG_FEATURE_REMOTE_LOG /* If they have not specified remote logging, then log locally */ - if (doRemoteLog == FALSE) - local_logging = TRUE; -#endif + if (ENABLE_FEATURE_REMOTE_LOG && !(opts & SYSLOG_OPT_remotelog)) + opts |= SYSLOG_OPT_locallog; /* Store away localhost's name before the fork */