aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2006-08-20 17:35:13 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2006-08-20 17:35:13 +0000
commitd591a360d39f9bca3479b913fe4c5773965d18cf (patch)
tree994b43e608bc4640dff7d1bd333938229b874d82
parent13068a4fdbe558daea85820fec663db3536aacff (diff)
downloadbusybox-w32-d591a360d39f9bca3479b913fe4c5773965d18cf.tar.gz
busybox-w32-d591a360d39f9bca3479b913fe4c5773965d18cf.tar.bz2
busybox-w32-d591a360d39f9bca3479b913fe4c5773965d18cf.zip
- 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
-rw-r--r--INSTALL6
-rw-r--r--archival/gzip.c14
-rw-r--r--archival/rpm.c43
-rw-r--r--coreutils/env.c11
-rw-r--r--coreutils/uudecode.c3
-rw-r--r--docs/busybox.net/FAQ.html10
-rw-r--r--editors/vi.c15
-rw-r--r--libbb/vfork_daemon_rexec.c4
-rw-r--r--miscutils/less.c7
-rw-r--r--miscutils/makedevs.c3
-rw-r--r--networking/inetd.c4
-rw-r--r--networking/libiproute/iplink.c3
-rw-r--r--shell/lash.c126
-rw-r--r--sysklogd/syslogd.c98
14 files changed, 137 insertions, 210 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
32programs by that name. Supplying an empty command path (as above) means 32programs by that name. Supplying an empty command path (as above) means
33the only commands busybox can find are the built-in ones. 33the only commands busybox can find are the built-in ones.
34 34
35(Note that the standalone shell currently requires /proc/self/exe to 35Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH
36launch new applets.) 36to be set appropriately, depending on whether or not /proc/self/exe is
37available or not. If you do not have /proc, then point that config option
38to the location of your busybox binary, usually /bin/busybox.
37 39
38Configuring Busybox: 40Configuring Busybox:
39==================== 41====================
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);
263static int foreground; /* set if program run in foreground */ 263static int foreground; /* set if program run in foreground */
264static int method = DEFLATED; /* compression method */ 264static int method = DEFLATED; /* compression method */
265static int exit_code = OK; /* program exit code */ 265static int exit_code = OK; /* program exit code */
266static int part_nb; /* number of parts in .gz file */
267static long time_stamp; /* original time stamp (modification time) */ 266static long time_stamp; /* original time stamp (modification time) */
268static long ifile_size; /* input file size, -1 for devices (debug only) */
269static char z_suffix[MAX_SUFFIX + 1]; /* default suffix (can be set with --suffix) */ 267static char z_suffix[MAX_SUFFIX + 1]; /* default suffix (can be set with --suffix) */
270static int z_len; /* strlen(z_suffix) */
271 268
272static int ifd; /* input file descriptor */ 269static int ifd; /* input file descriptor */
273static int ofd; /* output file descriptor */ 270static int ofd; /* output file descriptor */
271#ifdef DEBUG
274static unsigned insize; /* valid bytes in inbuf */ 272static unsigned insize; /* valid bytes in inbuf */
273#endif
275static unsigned outcnt; /* bytes in output buffer */ 274static unsigned outcnt; /* bytes in output buffer */
276 275
277static uint32_t *crc_32_tab; 276static uint32_t *crc_32_tab;
@@ -302,7 +301,9 @@ static void abort_gzip(int ATTRIBUTE_UNUSED ignored)
302static void clear_bufs(void) 301static void clear_bufs(void)
303{ 302{
304 outcnt = 0; 303 outcnt = 0;
304#ifdef DEBUG
305 insize = 0; 305 insize = 0;
306#endif
306 bytes_in = 0L; 307 bytes_in = 0L;
307} 308}
308 309
@@ -1177,7 +1178,6 @@ int gzip_main(int argc, char **argv)
1177#endif 1178#endif
1178 1179
1179 strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix) - 1); 1180 strncpy(z_suffix, Z_SUFFIX, sizeof(z_suffix) - 1);
1180 z_len = strlen(z_suffix);
1181 1181
1182 /* Allocate all global buffers (for DYN_ALLOC option) */ 1182 /* Allocate all global buffers (for DYN_ALLOC option) */
1183 ALLOC(uch, inbuf, INBUFSIZ + INBUF_EXTRA); 1183 ALLOC(uch, inbuf, INBUFSIZ + INBUF_EXTRA);
@@ -1188,13 +1188,11 @@ int gzip_main(int argc, char **argv)
1188 1188
1189 /* Initialise the CRC32 table */ 1189 /* Initialise the CRC32 table */
1190 crc_32_tab = crc32_filltable(0); 1190 crc_32_tab = crc32_filltable(0);
1191 1191
1192 clear_bufs(); 1192 clear_bufs();
1193 part_nb = 0;
1194 1193
1195 if (optind == argc) { 1194 if (optind == argc) {
1196 time_stamp = 0; 1195 time_stamp = 0;
1197 ifile_size = -1L;
1198 zip(STDIN_FILENO, STDOUT_FILENO); 1196 zip(STDIN_FILENO, STDOUT_FILENO);
1199 } else { 1197 } else {
1200 int i; 1198 int i;
@@ -1205,7 +1203,6 @@ int gzip_main(int argc, char **argv)
1205 clear_bufs(); 1203 clear_bufs();
1206 if (strcmp(argv[i], "-") == 0) { 1204 if (strcmp(argv[i], "-") == 0) {
1207 time_stamp = 0; 1205 time_stamp = 0;
1208 ifile_size = -1L;
1209 inFileNum = STDIN_FILENO; 1206 inFileNum = STDIN_FILENO;
1210 outFileNum = STDOUT_FILENO; 1207 outFileNum = STDOUT_FILENO;
1211 } else { 1208 } else {
@@ -1213,7 +1210,6 @@ int gzip_main(int argc, char **argv)
1213 if (fstat(inFileNum, &statBuf) < 0) 1210 if (fstat(inFileNum, &statBuf) < 0)
1214 bb_perror_msg_and_die("%s", argv[i]); 1211 bb_perror_msg_and_die("%s", argv[i]);
1215 time_stamp = statBuf.st_ctime; 1212 time_stamp = statBuf.st_ctime;
1216 ifile_size = statBuf.st_size;
1217 1213
1218 if (!tostdout) { 1214 if (!tostdout) {
1219 path = xmalloc(strlen(argv[i]) + 4); 1215 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;
70static rpm_index **mytags; 70static rpm_index **mytags;
71static int tagcount; 71static int tagcount;
72 72
73void extract_cpio_gz(int fd); 73static void extract_cpio_gz(int fd);
74rpm_index **rpm_gettags(int fd, int *num_tags); 74static rpm_index **rpm_gettags(int fd, int *num_tags);
75int bsearch_rpmtag(const void *key, const void *item); 75static int bsearch_rpmtag(const void *key, const void *item);
76char *rpm_getstring(int tag, int itemindex); 76static char *rpm_getstring(int tag, int itemindex);
77int rpm_getint(int tag, int itemindex); 77static int rpm_getint(int tag, int itemindex);
78int rpm_getcount(int tag); 78static int rpm_getcount(int tag);
79void exec_script(int progtag, int datatag, char *prefix); 79static void fileaction_dobackup(char *filename, int fileref);
80void fileaction_dobackup(char *filename, int fileref); 80static void fileaction_setowngrp(char *filename, int fileref);
81void fileaction_setowngrp(char *filename, int fileref); 81static void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref));
82void fileaction_list(char *filename, int itemno);
83void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref));
84 82
85int rpm_main(int argc, char **argv) 83int rpm_main(int argc, char **argv)
86{ 84{
@@ -169,7 +167,7 @@ int rpm_main(int argc, char **argv)
169 return 0; 167 return 0;
170} 168}
171 169
172void extract_cpio_gz(int fd) { 170static void extract_cpio_gz(int fd) {
173 archive_handle_t *archive_handle; 171 archive_handle_t *archive_handle;
174 unsigned char magic[2]; 172 unsigned char magic[2];
175 173
@@ -196,7 +194,7 @@ void extract_cpio_gz(int fd) {
196} 194}
197 195
198 196
199rpm_index **rpm_gettags(int fd, int *num_tags) 197static rpm_index **rpm_gettags(int fd, int *num_tags)
200{ 198{
201 rpm_index **tags = xzalloc(200 * sizeof(struct rpmtag *)); /* We should never need mode than 200, and realloc later */ 199 rpm_index **tags = xzalloc(200 * sizeof(struct rpmtag *)); /* We should never need mode than 200, and realloc later */
202 int pass, tagindex = 0; 200 int pass, tagindex = 0;
@@ -235,14 +233,14 @@ rpm_index **rpm_gettags(int fd, int *num_tags)
235 return tags; /* All done, leave the file at the start of the gzipped cpio archive */ 233 return tags; /* All done, leave the file at the start of the gzipped cpio archive */
236} 234}
237 235
238int bsearch_rpmtag(const void *key, const void *item) 236static int bsearch_rpmtag(const void *key, const void *item)
239{ 237{
240 int *tag = (int *)key; 238 int *tag = (int *)key;
241 rpm_index **tmp = (rpm_index **) item; 239 rpm_index **tmp = (rpm_index **) item;
242 return (*tag - tmp[0]->tag); 240 return (*tag - tmp[0]->tag);
243} 241}
244 242
245int rpm_getcount(int tag) 243static int rpm_getcount(int tag)
246{ 244{
247 rpm_index **found; 245 rpm_index **found;
248 found = bsearch(&tag, mytags, tagcount, sizeof(struct rpmtag *), bsearch_rpmtag); 246 found = bsearch(&tag, mytags, tagcount, sizeof(struct rpmtag *), bsearch_rpmtag);
@@ -250,7 +248,7 @@ int rpm_getcount(int tag)
250 else return found[0]->count; 248 else return found[0]->count;
251} 249}
252 250
253char *rpm_getstring(int tag, int itemindex) 251static char *rpm_getstring(int tag, int itemindex)
254{ 252{
255 rpm_index **found; 253 rpm_index **found;
256 found = bsearch(&tag, mytags, tagcount, sizeof(struct rpmtag *), bsearch_rpmtag); 254 found = bsearch(&tag, mytags, tagcount, sizeof(struct rpmtag *), bsearch_rpmtag);
@@ -263,7 +261,7 @@ char *rpm_getstring(int tag, int itemindex)
263 } else return NULL; 261 } else return NULL;
264} 262}
265 263
266int rpm_getint(int tag, int itemindex) 264static int rpm_getint(int tag, int itemindex)
267{ 265{
268 rpm_index **found; 266 rpm_index **found;
269 int n, *tmpint; 267 int n, *tmpint;
@@ -284,7 +282,7 @@ int rpm_getint(int tag, int itemindex)
284 } else return -1; 282 } else return -1;
285} 283}
286 284
287void fileaction_dobackup(char *filename, int fileref) 285static void fileaction_dobackup(char *filename, int fileref)
288{ 286{
289 struct stat oldfile; 287 struct stat oldfile;
290 int stat_res; 288 int stat_res;
@@ -301,7 +299,7 @@ void fileaction_dobackup(char *filename, int fileref)
301 } 299 }
302} 300}
303 301
304void fileaction_setowngrp(char *filename, int fileref) 302static void fileaction_setowngrp(char *filename, int fileref)
305{ 303{
306 int uid, gid; 304 int uid, gid;
307 uid = bb_xgetpwnam(rpm_getstring(RPMTAG_FILEUSERNAME, fileref)); 305 uid = bb_xgetpwnam(rpm_getstring(RPMTAG_FILEUSERNAME, fileref));
@@ -309,12 +307,7 @@ void fileaction_setowngrp(char *filename, int fileref)
309 chown (filename, uid, gid); 307 chown (filename, uid, gid);
310} 308}
311 309
312void fileaction_list(char *filename, int ATTRIBUTE_UNUSED fileref) 310static void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref))
313{
314 printf("%s\n", filename);
315}
316
317void loop_through_files(int filetag, void (*fileaction)(char *filename, int fileref))
318{ 311{
319 int count = 0; 312 int count = 0;
320 while (rpm_getstring(filetag, count)) { 313 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 @@
29 * - use bb_default_error_retval 29 * - use bb_default_error_retval
30 */ 30 */
31 31
32 32#include "busybox.h"
33#include <stdio.h>
34#include <string.h>
35#include <stdlib.h>
36#include <errno.h> 33#include <errno.h>
37#include <unistd.h>
38#include <getopt.h> /* struct option */ 34#include <getopt.h> /* struct option */
39#include "busybox.h"
40 35
41#if ENABLE_FEATURE_ENV_LONG_OPTIONS 36#if ENABLE_FEATURE_ENV_LONG_OPTIONS
42static const struct option env_long_options[] = { 37static const struct option env_long_options[] = {
@@ -50,7 +45,7 @@ int env_main(int argc, char** argv)
50{ 45{
51 static char *cleanenv[1] = { NULL }; 46 static char *cleanenv[1] = { NULL };
52 47
53 char **ep, *p; 48 char **ep;
54 unsigned long opt; 49 unsigned long opt;
55 llist_t *unset_env = NULL; 50 llist_t *unset_env = NULL;
56 extern char **environ; 51 extern char **environ;
@@ -77,7 +72,7 @@ int env_main(int argc, char** argv)
77 } 72 }
78 } 73 }
79 74
80 while (*argv && ((p = strchr(*argv, '=')) != NULL)) { 75 while (*argv && (strchr(*argv, '=') != NULL)) {
81 if (putenv(*argv) < 0) { 76 if (putenv(*argv) < 0) {
82 bb_perror_msg_and_die("putenv"); 77 bb_perror_msg_and_die("putenv");
83 } 78 }
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)
129 FILE *src_stream; 129 FILE *src_stream;
130 char *outname = NULL; 130 char *outname = NULL;
131 char *line; 131 char *line;
132 int opt;
133 132
134 opt = bb_getopt_ulflags(argc, argv, "o:", &outname); 133 bb_getopt_ulflags(argc, argv, "o:", &outname);
135 134
136 if (optind == argc) { 135 if (optind == argc) {
137 src_stream = stdin; 136 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,
88 the command line "PATH= ./busybox ash". This will blank your command path 88 the command line "PATH= ./busybox ash". This will blank your command path
89 and run busybox as your command shell, so the only commands it can find 89 and run busybox as your command shell, so the only commands it can find
90 (without an explicit path such as /bin/ls) are the built-in busybox ones. 90 (without an explicit path such as /bin/ls) are the built-in busybox ones.
91 This is another good way to see what's built into busybox. (Note that the 91 This is another good way to see what's built into busybox.
92 standalone shell is dependent on the existence of /proc/self/exe, so before 92 Note that the standalone shell requires CONFIG_BUSYBOX_EXEC_PATH
93 using it in a chroot environment you must mount /proc.) 93 to be set appropriately, depending on whether or not /proc/self/exe is
94 available or not. If you do not have /proc, then point that config option
95 to the location of your busybox binary, usually /bin/busybox.
96 (So if you set it to /proc/self/exe, and happen to be able to chroot into
97 your rootfs, you must mount /proc beforehand.)
94</p> 98</p>
95 99
96<hr /> 100<hr />
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
116static int have_status_msg; // is default edit status needed? 116static int have_status_msg; // is default edit status needed?
117static int last_status_cksum; // hash of current status line 117static int last_status_cksum; // hash of current status line
118static Byte *cfn; // previous, current, and next file name 118static Byte *cfn; // previous, current, and next file name
119static Byte *text, *end, *textend; // pointers to the user data in memory 119static Byte *text, *end; // pointers to the user data in memory
120static Byte *screen; // pointer to the virtual screen buffer 120static Byte *screen; // pointer to the virtual screen buffer
121static int screensize; // and its size 121static int screensize; // and its size
122static Byte *screenbegin; // index into text[], of top line on the screen 122static Byte *screenbegin; // index into text[], of top line on the screen
@@ -582,7 +582,7 @@ static void colon(Byte * buf)
582{ 582{
583 Byte c, *orig_buf, *buf1, *q, *r; 583 Byte c, *orig_buf, *buf1, *q, *r;
584 Byte *fn, cmd[BUFSIZ], args[BUFSIZ]; 584 Byte *fn, cmd[BUFSIZ], args[BUFSIZ];
585 int i, l, li, ch, st, b, e; 585 int i, l, li, ch, b, e;
586 int useforce = FALSE, forced = FALSE; 586 int useforce = FALSE, forced = FALSE;
587 struct stat st_buf; 587 struct stat st_buf;
588 588
@@ -606,7 +606,7 @@ static void colon(Byte * buf)
606 if (*buf == ':') 606 if (*buf == ':')
607 buf++; // move past the ':' 607 buf++; // move past the ':'
608 608
609 li = st = ch = i = 0; 609 li = ch = i = 0;
610 b = e = -1; 610 b = e = -1;
611 q = text; // assume 1,$ for the range 611 q = text; // assume 1,$ for the range
612 r = end - 1; 612 r = end - 1;
@@ -1075,14 +1075,13 @@ static void Hit_Return(void)
1075//----- Synchronize the cursor to Dot -------------------------- 1075//----- Synchronize the cursor to Dot --------------------------
1076static void sync_cursor(Byte * d, int *row, int *col) 1076static void sync_cursor(Byte * d, int *row, int *col)
1077{ 1077{
1078 Byte *beg_cur; // begin and end of "d" line 1078 Byte *beg_cur; // begin and end of "d" line
1079 Byte *beg_scr, *end_scr; // begin and end of screen 1079 Byte *end_scr; // begin and end of screen
1080 Byte *tp; 1080 Byte *tp;
1081 int cnt, ro, co; 1081 int cnt, ro, co;
1082 1082
1083 beg_cur = begin_line(d); // first char of cur line 1083 beg_cur = begin_line(d); // first char of cur line
1084 1084
1085 beg_scr = end_scr = screenbegin; // first char of screen
1086 end_scr = end_screen(); // last char of screen 1085 end_scr = end_screen(); // last char of screen
1087 1086
1088 if (beg_cur < screenbegin) { 1087 if (beg_cur < screenbegin) {
@@ -1385,8 +1384,6 @@ static Byte *new_text(int size)
1385 text = (Byte *) xmalloc(size + 8); 1384 text = (Byte *) xmalloc(size + 8);
1386 memset(text, '\0', size); // clear new text[] 1385 memset(text, '\0', size); // clear new text[]
1387 //text += 4; // leave some room for "oops" 1386 //text += 4; // leave some room for "oops"
1388 textend = text + size - 1;
1389 //textend -= 4; // leave some root for "oops"
1390 return (text); 1387 return (text);
1391} 1388}
1392 1389
@@ -1963,9 +1960,7 @@ static Byte *text_yank(Byte * p, Byte * q, int dest) // copy text into a registe
1963static Byte what_reg(void) 1960static Byte what_reg(void)
1964{ 1961{
1965 Byte c; 1962 Byte c;
1966 int i;
1967 1963
1968 i = 0;
1969 c = 'D'; // default to D-reg 1964 c = 'D'; // default to D-reg
1970 if (0 <= YDreg && YDreg <= 25) 1965 if (0 <= YDreg && YDreg <= 25)
1971 c = 'a' + (Byte) YDreg; 1966 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,
33 setsid(); 33 setsid();
34 34
35 if (!nochdir) 35 if (!nochdir)
36 chdir("/"); 36 xchdir("/");
37 37
38 if (!noclose && (fd = open(bb_dev_null, O_RDWR, 0)) != -1) { 38 if (!noclose && (fd = open(bb_dev_null, O_RDWR, 0)) != -1) {
39 dup2(fd, STDIN_FILENO); 39 dup2(fd, STDIN_FILENO);
@@ -44,7 +44,7 @@ void vfork_daemon_rexec(int nochdir, int noclose,
44 } 44 }
45 45
46 vfork_args = xcalloc(sizeof(char *), argc + 3); 46 vfork_args = xcalloc(sizeof(char *), argc + 3);
47 vfork_args[a++] = "/bin/busybox"; 47 vfork_args[a++] = CONFIG_BUSYBOX_EXEC_PATH;
48 while(*argv) { 48 while(*argv) {
49 vfork_args[a++] = *argv; 49 vfork_args[a++] = *argv;
50 argv++; 50 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)
872static void add_mark(void) 872static void add_mark(void)
873{ 873{
874 int letter; 874 int letter;
875 int mark_line;
876 875
877 clear_line(); 876 clear_line();
878 printf("Mark: "); 877 printf("Mark: ");
879 letter = tless_getch(); 878 letter = tless_getch();
880 879
881 if (isalpha(letter)) { 880 if (isalpha(letter)) {
882 mark_line = line_pos;
883 881
884 /* If we exceed 15 marks, start overwriting previous ones */ 882 /* If we exceed 15 marks, start overwriting previous ones */
885 if (num_marks == 14) 883 if (num_marks == 14)
@@ -927,19 +925,14 @@ static char opp_bracket(char bracket)
927 switch (bracket) { 925 switch (bracket) {
928 case '{': case '[': 926 case '{': case '[':
929 return bracket + 2; 927 return bracket + 2;
930 break;
931 case '(': 928 case '(':
932 return ')'; 929 return ')';
933 break;
934 case '}': case ']': 930 case '}': case ']':
935 return bracket - 2; 931 return bracket - 2;
936 break;
937 case ')': 932 case ')':
938 return '('; 933 return '(';
939 break;
940 default: 934 default:
941 return 0; 935 return 0;
942 break;
943 } 936 }
944} 937}
945 938
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)
76 int linenum = 0; 76 int linenum = 0;
77 int ret = EXIT_SUCCESS; 77 int ret = EXIT_SUCCESS;
78 78
79 unsigned long flags; 79 bb_getopt_ulflags(argc, argv, "d:", &line);
80 flags = bb_getopt_ulflags(argc, argv, "d:", &line);
81 if (line) 80 if (line)
82 table = xfopen(line, "r"); 81 table = xfopen(line, "r");
83 82
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)
908{ 908{
909 servtab_t *sep, *cp, **sepp; 909 servtab_t *sep, *cp, **sepp;
910 sigset_t omask; 910 sigset_t omask;
911 int add;
912 size_t n; 911 size_t n;
913 char protoname[10]; 912 char protoname[10];
914 913
@@ -923,7 +922,7 @@ static void config (int sig ATTRIBUTE_UNUSED)
923 for (sep = servtab; sep; sep = sep->se_next) 922 for (sep = servtab; sep; sep = sep->se_next)
924 if (matchconf (sep, cp)) 923 if (matchconf (sep, cp))
925 break; 924 break;
926 add = 0; 925
927 if (sep != 0) { 926 if (sep != 0) {
928 int i; 927 int i;
929 928
@@ -958,7 +957,6 @@ static void config (int sig ATTRIBUTE_UNUSED)
958#endif 957#endif
959 sigprocmask(SIG_UNBLOCK, &omask, NULL); 958 sigprocmask(SIG_UNBLOCK, &omask, NULL);
960 freeconfig (cp); 959 freeconfig (cp);
961 add = 1;
962 } else { 960 } else {
963 sep = enter (cp); 961 sep = enter (cp);
964 } 962 }
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 @@
29/* take from linux/sockios.h */ 29/* take from linux/sockios.h */
30#define SIOCSIFNAME 0x8923 /* set interface name */ 30#define SIOCSIFNAME 0x8923 /* set interface name */
31 31
32static int do_link;
33
34static int on_off(char *msg) 32static int on_off(char *msg)
35{ 33{
36 bb_error_msg("Error: argument of \"%s\" must be \"on\" or \"off\"", msg); 34 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)
336static int ipaddr_list_link(int argc, char **argv) 334static int ipaddr_list_link(int argc, char **argv)
337{ 335{
338 preferred_family = AF_PACKET; 336 preferred_family = AF_PACKET;
339 do_link = 1;
340 return ipaddr_list_or_flush(argc, argv, 0); 337 return ipaddr_list_or_flush(argc, argv, 0);
341} 338}
342 339
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 {
54 ELSE_EXP_CONTEXT = 0x10 54 ELSE_EXP_CONTEXT = 0x10
55}; 55};
56 56
57#define LASH_OPT_DONE (1)
58#define LASH_OPT_SAW_QUOTE (2)
59
57#ifdef CONFIG_LASH_PIPE_N_REDIRECTS 60#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
58struct redir_struct { 61struct redir_struct {
59 enum redir_type type; /* type of redirection */ 62 enum redir_type type; /* type of redirection */
@@ -154,7 +157,7 @@ static int shell_context; /* Type prompt trigger (PS1 or PS2) */
154 157
155/* Globals that are static to this file */ 158/* Globals that are static to this file */
156static const char *cwd; 159static const char *cwd;
157static char *local_pending_command = NULL; 160static char *local_pending_command;
158static struct jobset job_list = { NULL, NULL }; 161static struct jobset job_list = { NULL, NULL };
159static int argc; 162static int argc;
160static char **argv; 163static char **argv;
@@ -176,7 +179,7 @@ static inline void debug_printf(const char *format, ...)
176 va_end(args); 179 va_end(args);
177} 180}
178#else 181#else
179static inline void debug_printf(const char *format, ...) { } 182static inline void debug_printf(const char ATTRIBUTE_UNUSED *format, ...) { }
180#endif 183#endif
181 184
182/* 185/*
@@ -304,12 +307,12 @@ static int builtin_fg_bg(struct child_prog *child)
304} 307}
305 308
306/* built-in 'help' handler */ 309/* built-in 'help' handler */
307static int builtin_help(struct child_prog *dummy) 310static int builtin_help(struct child_prog ATTRIBUTE_UNUSED *dummy)
308{ 311{
309 struct built_in_command *x; 312 struct built_in_command *x;
310 313
311 printf("\nBuilt-in commands:\n"); 314 printf("\nBuilt-in commands:\n"
312 printf("-------------------\n"); 315 "-------------------\n");
313 for (x = bltins; x->cmd; x++) { 316 for (x = bltins; x->cmd; x++) {
314 if (x->descr==NULL) 317 if (x->descr==NULL)
315 continue; 318 continue;
@@ -320,7 +323,7 @@ static int builtin_help(struct child_prog *dummy)
320 continue; 323 continue;
321 printf("%s\t%s\n", x->cmd, x->descr); 324 printf("%s\t%s\n", x->cmd, x->descr);
322 } 325 }
323 printf("\n\n"); 326 putchar('\n');
324 return EXIT_SUCCESS; 327 return EXIT_SUCCESS;
325} 328}
326 329
@@ -343,7 +346,7 @@ static int builtin_jobs(struct child_prog *child)
343 346
344 347
345/* built-in 'pwd' handler */ 348/* built-in 'pwd' handler */
346static int builtin_pwd(struct child_prog *dummy) 349static int builtin_pwd(struct child_prog ATTRIBUTE_UNUSED *dummy)
347{ 350{
348 cwd = xgetcwd((char *)cwd); 351 cwd = xgetcwd((char *)cwd);
349 if (!cwd) 352 if (!cwd)
@@ -386,7 +389,7 @@ static int builtin_export(struct child_prog *child)
386/* built-in 'read VAR' handler */ 389/* built-in 'read VAR' handler */
387static int builtin_read(struct child_prog *child) 390static int builtin_read(struct child_prog *child)
388{ 391{
389 int res = 0, len, newlen; 392 int res = 0, len;
390 char *s; 393 char *s;
391 char string[MAX_READ]; 394 char string[MAX_READ];
392 395
@@ -397,16 +400,16 @@ static int builtin_read(struct child_prog *child)
397 string[len++] = '='; 400 string[len++] = '=';
398 string[len] = '\0'; 401 string[len] = '\0';
399 fgets(&string[len], sizeof(string) - len, stdin); /* read string */ 402 fgets(&string[len], sizeof(string) - len, stdin); /* read string */
400 newlen = strlen(string); 403 res = strlen(string);
401 if(newlen > len) 404 if (res > len)
402 string[--newlen] = '\0'; /* chomp trailing newline */ 405 string[--res] = '\0'; /* chomp trailing newline */
403 /* 406 /*
404 ** string should now contain "VAR=<value>" 407 ** string should now contain "VAR=<value>"
405 ** copy it (putenv() won't do that, so we must make sure 408 ** copy it (putenv() won't do that, so we must make sure
406 ** the string resides in a static buffer!) 409 ** the string resides in a static buffer!)
407 */ 410 */
408 res = -1; 411 res = -1;
409 if((s = strdup(string))) 412 if ((s = strdup(string)))
410 res = putenv(s); 413 res = putenv(s);
411 if (res) 414 if (res)
412 bb_perror_msg("read"); 415 bb_perror_msg("read");
@@ -423,12 +426,8 @@ static int builtin_source(struct child_prog *child)
423 FILE *input; 426 FILE *input;
424 int status; 427 int status;
425 428
426 if (child->argv[1] == NULL) 429 input = bb_wfopen(child->argv[1], "r");
427 return EXIT_FAILURE;
428
429 input = fopen(child->argv[1], "r");
430 if (!input) { 430 if (!input) {
431 printf( "Couldn't open file '%s'\n", child->argv[1]);
432 return EXIT_FAILURE; 431 return EXIT_FAILURE;
433 } 432 }
434 433
@@ -635,7 +634,7 @@ static inline void setup_prompt_string(char **prompt_str)
635 if (shell_context == 0) { 634 if (shell_context == 0) {
636 free(PS1); 635 free(PS1);
637 PS1=xmalloc(strlen(cwd)+4); 636 PS1=xmalloc(strlen(cwd)+4);
638 sprintf(PS1, "%s %s", cwd, ( geteuid() != 0 ) ? "$ ":"# "); 637 sprintf(PS1, "%s %c ", cwd, ( geteuid() != 0 ) ? '$': '#');
639 *prompt_str = PS1; 638 *prompt_str = PS1;
640 } else { 639 } else {
641 *prompt_str = PS2; 640 *prompt_str = PS2;
@@ -688,20 +687,18 @@ static int get_command(FILE * source, char *command)
688 687
689static char * strsep_space( char *string, int * ix) 688static char * strsep_space( char *string, int * ix)
690{ 689{
691 char *token;
692
693 /* Short circuit the trivial case */ 690 /* Short circuit the trivial case */
694 if ( !string || ! string[*ix]) 691 if ( !string || ! string[*ix])
695 return NULL; 692 return NULL;
696 693
697 /* Find the end of the token. */ 694 /* Find the end of the token. */
698 while( string[*ix] && !isspace(string[*ix]) ) { 695 while (string[*ix] && !isspace(string[*ix]) ) {
699 (*ix)++; 696 (*ix)++;
700 } 697 }
701 698
702 /* Find the end of any whitespace trailing behind 699 /* Find the end of any whitespace trailing behind
703 * the token and let that be part of the token */ 700 * the token and let that be part of the token */
704 while( string[*ix] && isspace(string[*ix]) ) { 701 while (string[*ix] && (isspace)(string[*ix]) ) {
705 (*ix)++; 702 (*ix)++;
706 } 703 }
707 704
@@ -710,9 +707,7 @@ static char * strsep_space( char *string, int * ix)
710 return NULL; 707 return NULL;
711 } 708 }
712 709
713 token = xstrndup(string, *ix); 710 return xstrndup(string, *ix);
714
715 return token;
716} 711}
717 712
718static int expand_arguments(char *command) 713static int expand_arguments(char *command)
@@ -721,7 +716,7 @@ static int expand_arguments(char *command)
721 expand_t expand_result; 716 expand_t expand_result;
722 char *tmpcmd, *cmd, *cmd_copy; 717 char *tmpcmd, *cmd, *cmd_copy;
723 char *src, *dst, *var; 718 char *src, *dst, *var;
724 const char *out_of_space = "out of space during expansion"; 719 const char * const out_of_space = "out of space during expansion";
725 int flags = GLOB_NOCHECK 720 int flags = GLOB_NOCHECK
726#ifdef GLOB_BRACE 721#ifdef GLOB_BRACE
727 | GLOB_BRACE 722 | GLOB_BRACE
@@ -846,7 +841,7 @@ static int expand_arguments(char *command)
846 num_skip_chars=1; 841 num_skip_chars=1;
847 } else { 842 } else {
848 src=dst+1; 843 src=dst+1;
849 while(isalnum(*src) || *src=='_') src++; 844 while((isalnum)(*src) || *src=='_') src++;
850 } 845 }
851 if (src == NULL) { 846 if (src == NULL) {
852 src = dst+dstlen; 847 src = dst+dstlen;
@@ -890,10 +885,9 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
890 char *command; 885 char *command;
891 char *return_command = NULL; 886 char *return_command = NULL;
892 char *src, *buf; 887 char *src, *buf;
893 int argc_l = 0; 888 int argc_l;
894 int done = 0; 889 int flag;
895 int argv_alloced; 890 int argv_alloced;
896 int saw_quote = 0;
897 char quote = '\0'; 891 char quote = '\0';
898 struct child_prog *prog; 892 struct child_prog *prog;
899#ifdef CONFIG_LASH_PIPE_N_REDIRECTS 893#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
@@ -902,8 +896,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
902#endif 896#endif
903 897
904 /* skip leading white space */ 898 /* skip leading white space */
905 while (**command_ptr && isspace(**command_ptr)) 899 *command_ptr = skip_whitespace(*command_ptr);
906 (*command_ptr)++;
907 900
908 /* this handles empty lines or leading '#' characters */ 901 /* this handles empty lines or leading '#' characters */
909 if (!**command_ptr || (**command_ptr == '#')) { 902 if (!**command_ptr || (**command_ptr == '#')) {
@@ -937,9 +930,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
937 prog->argv = xmalloc(sizeof(*prog->argv) * argv_alloced); 930 prog->argv = xmalloc(sizeof(*prog->argv) * argv_alloced);
938 prog->argv[0] = job->cmdbuf; 931 prog->argv[0] = job->cmdbuf;
939 932
933 flag = argc_l = 0;
940 buf = command; 934 buf = command;
941 src = *command_ptr; 935 src = *command_ptr;
942 while (*src && !done) { 936 while (*src && !(flag & LASH_OPT_DONE)) {
943 if (quote == *src) { 937 if (quote == *src) {
944 quote = '\0'; 938 quote = '\0';
945 } else if (quote) { 939 } else if (quote) {
@@ -960,7 +954,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
960 *src == ']') *buf++ = '\\'; 954 *src == ']') *buf++ = '\\';
961 *buf++ = *src; 955 *buf++ = *src;
962 } else if (isspace(*src)) { 956 } else if (isspace(*src)) {
963 if (*prog->argv[argc_l] || saw_quote) { 957 if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE) {
964 buf++, argc_l++; 958 buf++, argc_l++;
965 /* +1 here leaves room for the NULL which ends argv */ 959 /* +1 here leaves room for the NULL which ends argv */
966 if ((argc_l + 1) == argv_alloced) { 960 if ((argc_l + 1) == argv_alloced) {
@@ -970,21 +964,21 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
970 argv_alloced); 964 argv_alloced);
971 } 965 }
972 prog->argv[argc_l] = buf; 966 prog->argv[argc_l] = buf;
973 saw_quote = 0; 967 flag ^= LASH_OPT_SAW_QUOTE;
974 } 968 }
975 } else 969 } else
976 switch (*src) { 970 switch (*src) {
977 case '"': 971 case '"':
978 case '\'': 972 case '\'':
979 quote = *src; 973 quote = *src;
980 saw_quote = 1; 974 flag |= LASH_OPT_SAW_QUOTE;
981 break; 975 break;
982 976
983 case '#': /* comment */ 977 case '#': /* comment */
984 if (*(src-1)== '$') 978 if (*(src-1)== '$')
985 *buf++ = *src; 979 *buf++ = *src;
986 else 980 else
987 done = 1; 981 flag |= LASH_OPT_DONE;
988 break; 982 break;
989 983
990#ifdef CONFIG_LASH_PIPE_N_REDIRECTS 984#ifdef CONFIG_LASH_PIPE_N_REDIRECTS
@@ -1027,8 +1021,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
1027 1021
1028 /* This isn't POSIX sh compliant. Oh well. */ 1022 /* This isn't POSIX sh compliant. Oh well. */
1029 chptr = src; 1023 chptr = src;
1030 while (isspace(*chptr)) 1024 chptr = skip_whitespace(chptr);
1031 chptr++;
1032 1025
1033 if (!*chptr) { 1026 if (!*chptr) {
1034 bb_error_msg("file name expected after %c", *(src-1)); 1027 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)
1047 1040
1048 case '|': /* pipe */ 1041 case '|': /* pipe */
1049 /* finish this command */ 1042 /* finish this command */
1050 if (*prog->argv[argc_l] || saw_quote) 1043 if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE)
1051 argc_l++; 1044 argc_l++;
1052 if (!argc_l) { 1045 if (!argc_l) {
1053 bb_error_msg("empty command in pipe"); 1046 goto empty_command_in_pipe;
1054 free_job(job);
1055 job->num_progs=0;
1056 return 1;
1057 } 1047 }
1058 prog->argv[argc_l] = NULL; 1048 prog->argv[argc_l] = NULL;
1059 1049
@@ -1073,10 +1063,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
1073 prog->argv[0] = ++buf; 1063 prog->argv[0] = ++buf;
1074 1064
1075 src++; 1065 src++;
1076 while (*src && isspace(*src)) 1066 src = skip_whitespace(src);
1077 src++;
1078 1067
1079 if (!*src) { 1068 if (!*src) {
1069empty_command_in_pipe:
1080 bb_error_msg("empty command in pipe"); 1070 bb_error_msg("empty command in pipe");
1081 free_job(job); 1071 free_job(job);
1082 job->num_progs=0; 1072 job->num_progs=0;
@@ -1090,9 +1080,10 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
1090#ifdef CONFIG_LASH_JOB_CONTROL 1080#ifdef CONFIG_LASH_JOB_CONTROL
1091 case '&': /* background */ 1081 case '&': /* background */
1092 *inbg = 1; 1082 *inbg = 1;
1083 /* fallthrough */
1093#endif 1084#endif
1094 case ';': /* multiple commands */ 1085 case ';': /* multiple commands */
1095 done = 1; 1086 flag |= LASH_OPT_DONE;
1096 return_command = *command_ptr + (src - *command_ptr) + 1; 1087 return_command = *command_ptr + (src - *command_ptr) + 1;
1097 break; 1088 break;
1098 1089
@@ -1113,7 +1104,7 @@ static int parse_command(char **command_ptr, struct job *job, int *inbg)
1113 src++; 1104 src++;
1114 } 1105 }
1115 1106
1116 if (*prog->argv[argc_l] || saw_quote) { 1107 if (*prog->argv[argc_l] || flag & LASH_OPT_SAW_QUOTE) {
1117 argc_l++; 1108 argc_l++;
1118 } 1109 }
1119 if (!argc_l) { 1110 if (!argc_l) {
@@ -1295,7 +1286,7 @@ static int run_command(struct job *newjob, int inbg, int outpipe[2])
1295 signal(SIGTTOU, SIG_DFL); 1286 signal(SIGTTOU, SIG_DFL);
1296 signal(SIGCHLD, SIG_DFL); 1287 signal(SIGCHLD, SIG_DFL);
1297 1288
1298 // Close all open filehandles. 1289 /* Close all open filehandles. */
1299 while(close_me_list) close((long)llist_pop(&close_me_list)); 1290 while(close_me_list) close((long)llist_pop(&close_me_list));
1300 1291
1301 if (outpipe[1]!=-1) { 1292 if (outpipe[1]!=-1) {
@@ -1512,14 +1503,13 @@ static inline void setup_job_control(void)
1512 1503
1513int lash_main(int argc_l, char **argv_l) 1504int lash_main(int argc_l, char **argv_l)
1514{ 1505{
1515 int opt, interactive=FALSE; 1506 unsigned long opt;
1516 FILE *input = stdin; 1507 FILE *input = stdin;
1517 argc = argc_l; 1508 argc = argc_l;
1518 argv = argv_l; 1509 argv = argv_l;
1519 1510
1520 /* These variables need re-initializing when recursing */ 1511 /* These variables need re-initializing when recursing */
1521 last_jobid = 0; 1512 last_jobid = 0;
1522 local_pending_command = NULL;
1523 close_me_list = NULL; 1513 close_me_list = NULL;
1524 job_list.head = NULL; 1514 job_list.head = NULL;
1525 job_list.fg = NULL; 1515 job_list.fg = NULL;
@@ -1532,27 +1522,18 @@ int lash_main(int argc_l, char **argv_l)
1532 llist_add_to(&close_me_list, (void *)(long)fileno(prof_input)); 1522 llist_add_to(&close_me_list, (void *)(long)fileno(prof_input));
1533 /* Now run the file */ 1523 /* Now run the file */
1534 busy_loop(prof_input); 1524 busy_loop(prof_input);
1535 fclose(prof_input); 1525 bb_fclose_nonstdin(prof_input);
1536 llist_pop(&close_me_list); 1526 llist_pop(&close_me_list);
1537 } 1527 }
1538 } 1528 }
1539 1529
1540 while ((opt = getopt(argc_l, argv_l, "cxi")) > 0) { 1530 opt = bb_getopt_ulflags(argc_l, argv_l, "+ic:", &local_pending_command);
1541 switch (opt) { 1531#define LASH_OPT_i (1<<0)
1542 case 'c': 1532#define LASH_OPT_c (1<<2)
1543 input = NULL; 1533 if (opt & LASH_OPT_c) {
1544 if (local_pending_command != 0) 1534 input = NULL;
1545 bb_error_msg_and_die("multiple -c arguments"); 1535 optind++;
1546 local_pending_command = xstrdup(argv[optind]); 1536 argv += optind;
1547 optind++;
1548 argv = argv+optind;
1549 break;
1550 case 'i':
1551 interactive++;
1552 break;
1553 default:
1554 bb_show_usage();
1555 }
1556 } 1537 }
1557 /* A shell is interactive if the `-i' flag was given, or if all of 1538 /* A shell is interactive if the `-i' flag was given, or if all of
1558 * the following conditions are met: 1539 * the following conditions are met:
@@ -1564,14 +1545,15 @@ int lash_main(int argc_l, char **argv_l)
1564 if (argv[optind]==NULL && input==stdin && 1545 if (argv[optind]==NULL && input==stdin &&
1565 isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) 1546 isatty(STDIN_FILENO) && isatty(STDOUT_FILENO))
1566 { 1547 {
1567 interactive++; 1548 opt |= LASH_OPT_i;
1568 } 1549 }
1569 setup_job_control(); 1550 setup_job_control();
1570 if (interactive) { 1551 if (opt & LASH_OPT_i) {
1571 /* Looks like they want an interactive shell */ 1552 /* Looks like they want an interactive shell */
1572 if (!ENABLE_FEATURE_SH_EXTRA_QUIET) { 1553 if (!ENABLE_FEATURE_SH_EXTRA_QUIET) {
1573 printf( "\n\n%s Built-in shell (lash)\n", BB_BANNER); 1554 printf("\n\n%s Built-in shell (lash)\n"
1574 printf( "Enter 'help' for a list of built-in commands.\n\n"); 1555 "Enter 'help' for a list of built-in commands.\n\n",
1556 BB_BANNER);
1575 } 1557 }
1576 } else if (!local_pending_command && argv[optind]) { 1558 } else if (!local_pending_command && argv[optind]) {
1577 //printf( "optind=%d argv[optind]='%s'\n", optind, argv[optind]); 1559 //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;
57/* what port to log to? */ 57/* what port to log to? */
58static int RemotePort = 514; 58static int RemotePort = 514;
59 59
60/* To remote log or not to remote log, that is the question. */
61static int doRemoteLog = FALSE;
62static int local_logging = FALSE;
63#endif 60#endif
64 61
65/* Make loging output smaller. */ 62/* options */
66static bool small = false; 63static unsigned opts;
67 64#define SYSLOG_OPT_small (1)
65#define SYSLOG_OPT_remotelog (2)
66#define SYSLOG_OPT_locallog (4)
67#define SYSLOG_OPT_circularlog (8)
68 68
69#define MAXLINE 1024 /* maximum line length */ 69#define MAXLINE 1024 /* maximum line length */
70 70
@@ -98,28 +98,6 @@ static struct sembuf SMwdn[3] = { {0, 0}, {1, 0}, {1, +1} }; // set SMwdn
98static int shmid = -1; // ipc shared memory id 98static int shmid = -1; // ipc shared memory id
99static int s_semid = -1; // ipc semaphore id 99static int s_semid = -1; // ipc semaphore id
100static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size 100static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024); // default shm size
101static int circular_logging = FALSE;
102
103/*
104 * sem_up - up()'s a semaphore.
105 */
106static inline void sem_up(int semid)
107{
108 if (semop(semid, SMwup, 1) == -1) {
109 bb_perror_msg_and_die("semop[SMwup]");
110 }
111}
112
113/*
114 * sem_down - down()'s a semaphore
115 */
116static inline void sem_down(int semid)
117{
118 if (semop(semid, SMwdn, 3) == -1) {
119 bb_perror_msg_and_die("semop[SMwdn]");
120 }
121}
122
123 101
124static void ipcsyslog_cleanup(void) 102static void ipcsyslog_cleanup(void)
125{ 103{
@@ -169,8 +147,11 @@ static void ipcsyslog_init(void)
169static void circ_message(const char *msg) 147static void circ_message(const char *msg)
170{ 148{
171 int l = strlen(msg) + 1; /* count the whole message w/ '\0' included */ 149 int l = strlen(msg) + 1; /* count the whole message w/ '\0' included */
150 const char * const fail_msg = "Can't find the terminator token%s?\n";
172 151
173 sem_down(s_semid); 152 if (semop(s_semid, SMwdn, 3) == -1) {
153 bb_perror_msg_and_die("SMwdn");
154 }
174 155
175 /* 156 /*
176 * Circular Buffer Algorithm: 157 * Circular Buffer Algorithm:
@@ -220,7 +201,7 @@ static void circ_message(const char *msg)
220 /* Note: HEAD is only used to "retrieve" messages, it's not used 201 /* Note: HEAD is only used to "retrieve" messages, it's not used
221 when writing messages into our buffer */ 202 when writing messages into our buffer */
222 } else { /* show an error message to know we messed up? */ 203 } else { /* show an error message to know we messed up? */
223 printf("Weird! Can't find the terminator token?\n"); 204 printf(fail_msg,"");
224 buf->head = 0; 205 buf->head = 0;
225 } 206 }
226 } 207 }
@@ -256,13 +237,15 @@ static void circ_message(const char *msg)
256 /* we need to place the TAIL at the end of the message */ 237 /* we need to place the TAIL at the end of the message */
257 buf->tail = k + 1; 238 buf->tail = k + 1;
258 } else { 239 } else {
259 printf 240 printf(fail_msg, " from the beginning");
260 ("Weird! Can't find the terminator token from the beginning?\n");
261 buf->head = buf->tail = 0; /* reset buffer, since it's probably corrupted */ 241 buf->head = buf->tail = 0; /* reset buffer, since it's probably corrupted */
262 } 242 }
263 243
264 } 244 }
265 sem_up(s_semid); 245 if (semop(s_semid, SMwup, 1) == -1) {
246 bb_perror_msg_and_die("SMwup");
247 }
248
266} 249}
267#endif /* CONFIG_FEATURE_IPC_SYSLOG */ 250#endif /* CONFIG_FEATURE_IPC_SYSLOG */
268 251
@@ -280,7 +263,7 @@ static void message(char *fmt, ...)
280 fl.l_len = 1; 263 fl.l_len = 1;
281 264
282#ifdef CONFIG_FEATURE_IPC_SYSLOG 265#ifdef CONFIG_FEATURE_IPC_SYSLOG
283 if ((circular_logging == TRUE) && (buf != NULL)) { 266 if ((opts & SYSLOG_OPT_circularlog) && (buf != NULL)) {
284 char b[1024]; 267 char b[1024];
285 268
286 va_start(arguments, fmt); 269 va_start(arguments, fmt);
@@ -295,8 +278,8 @@ static void message(char *fmt, ...)
295 O_NONBLOCK)) >= 0) { 278 O_NONBLOCK)) >= 0) {
296 fl.l_type = F_WRLCK; 279 fl.l_type = F_WRLCK;
297 fcntl(fd, F_SETLKW, &fl); 280 fcntl(fd, F_SETLKW, &fl);
298#ifdef CONFIG_FEATURE_ROTATE_LOGFILE 281
299 if ( logFileSize > 0 ) { 282 if (ENABLE_FEATURE_ROTATE_LOGFILE && logFileSize > 0 ) {
300 struct stat statf; 283 struct stat statf;
301 int r = fstat(fd, &statf); 284 int r = fstat(fd, &statf);
302 if( !r && (statf.st_mode & S_IFREG) 285 if( !r && (statf.st_mode & S_IFREG)
@@ -324,7 +307,7 @@ static void message(char *fmt, ...)
324 } 307 }
325 } 308 }
326 } 309 }
327#endif 310
328 va_start(arguments, fmt); 311 va_start(arguments, fmt);
329 vdprintf(fd, fmt, arguments); 312 vdprintf(fd, fmt, arguments);
330 va_end(arguments); 313 va_end(arguments);
@@ -364,10 +347,7 @@ static void logMessage(int pri, char *msg)
364{ 347{
365 time_t now; 348 time_t now;
366 char *timestamp; 349 char *timestamp;
367 static char res[20]; 350 char res[20];
368#ifdef CONFIG_FEATURE_REMOTE_LOG
369 static char line[MAXLINE + 1];
370#endif
371 CODE *c_pri, *c_fac; 351 CODE *c_pri, *c_fac;
372 352
373 if (pri != 0) { 353 if (pri != 0) {
@@ -396,7 +376,8 @@ static void logMessage(int pri, char *msg)
396 /* todo: supress duplicates */ 376 /* todo: supress duplicates */
397 377
398#ifdef CONFIG_FEATURE_REMOTE_LOG 378#ifdef CONFIG_FEATURE_REMOTE_LOG
399 if (doRemoteLog == TRUE) { 379 if (opts & SYSLOG_OPT_remotelog) {
380 char line[MAXLINE + 1];
400 /* trying connect the socket */ 381 /* trying connect the socket */
401 if (-1 == remotefd) { 382 if (-1 == remotefd) {
402 init_RemoteLog(); 383 init_RemoteLog();
@@ -407,7 +388,7 @@ static void logMessage(int pri, char *msg)
407 now = 1; 388 now = 1;
408 snprintf(line, sizeof(line), "<%d>%s", pri, msg); 389 snprintf(line, sizeof(line), "<%d>%s", pri, msg);
409 390
410 retry: 391retry:
411 /* send message to remote logger */ 392 /* send message to remote logger */
412 if(( -1 == sendto(remotefd, line, strlen(line), 0, 393 if(( -1 == sendto(remotefd, line, strlen(line), 0,
413 (struct sockaddr *) &remoteaddr, 394 (struct sockaddr *) &remoteaddr,
@@ -420,11 +401,11 @@ static void logMessage(int pri, char *msg)
420 } 401 }
421 } 402 }
422 403
423 if (local_logging == TRUE) 404 if (opts & SYSLOG_OPT_locallog)
424#endif 405#endif
425 { 406 {
426 /* now spew out the message to wherever it is supposed to go */ 407 /* now spew out the message to wherever it is supposed to go */
427 if (small) 408 if (opts & SYSLOG_OPT_small)
428 message("%s %s\n", timestamp, msg); 409 message("%s %s\n", timestamp, msg);
429 else 410 else
430 message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); 411 message("%s %s %s %s\n", timestamp, LocalHostName, res, msg);
@@ -435,9 +416,8 @@ static void quit_signal(int sig)
435{ 416{
436 logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); 417 logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting.");
437 unlink(lfile); 418 unlink(lfile);
438#ifdef CONFIG_FEATURE_IPC_SYSLOG 419 if (ENABLE_FEATURE_IPC_SYSLOG)
439 ipcsyslog_cleanup(); 420 ipcsyslog_cleanup();
440#endif
441 421
442 exit(TRUE); 422 exit(TRUE);
443} 423}
@@ -531,17 +511,13 @@ static void doSyslogd(void)
531 if (chmod(lfile, 0666) < 0) { 511 if (chmod(lfile, 0666) < 0) {
532 bb_perror_msg_and_die("Could not set permission on " _PATH_LOG); 512 bb_perror_msg_and_die("Could not set permission on " _PATH_LOG);
533 } 513 }
534#ifdef CONFIG_FEATURE_IPC_SYSLOG 514 if (ENABLE_FEATURE_IPC_SYSLOG && opts & SYSLOG_OPT_circularlog) {
535 if (circular_logging == TRUE) {
536 ipcsyslog_init(); 515 ipcsyslog_init();
537 } 516 }
538#endif
539 517
540#ifdef CONFIG_FEATURE_REMOTE_LOG 518 if (ENABLE_FEATURE_REMOTE_LOG && opts & SYSLOG_OPT_remotelog) {
541 if (doRemoteLog == TRUE) {
542 init_RemoteLog(); 519 init_RemoteLog();
543 } 520 }
544#endif
545 521
546 logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER ); 522 logMessage(LOG_SYSLOG | LOG_INFO, "syslogd started: " "BusyBox v" BB_VER );
547 523
@@ -613,10 +589,10 @@ int syslogd_main(int argc, char **argv)
613 RemotePort = atoi(p + 1); 589 RemotePort = atoi(p + 1);
614 *p = '\0'; 590 *p = '\0';
615 } 591 }
616 doRemoteLog = TRUE; 592 opts |= SYSLOG_OPT_remotelog;
617 break; 593 break;
618 case 'L': 594 case 'L':
619 local_logging = TRUE; 595 opts |= SYSLOG_OPT_locallog;
620 break; 596 break;
621#endif 597#endif
622#ifdef CONFIG_FEATURE_IPC_SYSLOG 598#ifdef CONFIG_FEATURE_IPC_SYSLOG
@@ -627,22 +603,20 @@ int syslogd_main(int argc, char **argv)
627 shm_size = buf_size * 1024; 603 shm_size = buf_size * 1024;
628 } 604 }
629 } 605 }
630 circular_logging = TRUE; 606 opts |= SYSLOG_OPT_circularlog;
631 break; 607 break;
632#endif 608#endif
633 case 'S': 609 case 'S':
634 small = true; 610 opts |= SYSLOG_OPT_small;
635 break; 611 break;
636 default: 612 default:
637 bb_show_usage(); 613 bb_show_usage();
638 } 614 }
639 } 615 }
640 616
641#ifdef CONFIG_FEATURE_REMOTE_LOG
642 /* If they have not specified remote logging, then log locally */ 617 /* If they have not specified remote logging, then log locally */
643 if (doRemoteLog == FALSE) 618 if (ENABLE_FEATURE_REMOTE_LOG && !(opts & SYSLOG_OPT_remotelog))
644 local_logging = TRUE; 619 opts |= SYSLOG_OPT_locallog;
645#endif
646 620
647 621
648 /* Store away localhost's name before the fork */ 622 /* Store away localhost's name before the fork */