- merge -r15463:15564 from busybox_scratch branch through these changesets:
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -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: | |
| ==================== | |
| @@ -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); | |
| @@ -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)) { | |
| @@ -29,14 +29,9 @@ | |
| * - use bb_default_error_retval | |
| */ | |
| - | |
| - | #include <stdio.h> |
| - | #include <string.h> |
| - | #include <stdlib.h> |
| + | #include "busybox.h" |
| #include <errno.h> | |
| - | #include <unistd.h> |
| #include <getopt.h> /* struct option */ | |
| - | #include "busybox.h" |
| #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"); | |
| } | |
| @@ -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; | |
| @@ -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.) |
| </p> | |
| <hr /> | |
| @@ -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; | |
| @@ -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++; | |
| @@ -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; |
| } | |
| } | |
| @@ -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"); | |
| @@ -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); | |
| } | |
| @@ -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); | |
| } | |
| @@ -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=<value>" | |
| ** 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]); | |
| @@ -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 */ | |