+++ /dev/null
---- busybox-1.13.0/shell/ash.c Thu Oct 30 08:41:32 2008
-+++ busybox-1.13.0-ash/shell/ash.c Fri Nov 28 04:39:17 2008
-@@ -536,6 +536,7 @@
- #define NHERE 24
- #define NXHERE 25
- #define NNOT 26
-+#define N_NUMBER 27
-
- union node;
-
-@@ -7546,43 +7547,46 @@
-
- /* ============ eval.c */
-
--static int funcblocksize; /* size of structures in function */
--static int funcstringsize; /* size of strings in node */
--static void *funcblock; /* block to allocate function from */
--static char *funcstring; /* block to allocate strings from */
-+static int funcblocksize; /* size of structures in function */
-+static int funcstringsize; /* size of strings in node */
-+static void *funcblock; /* block to allocate function from */
-+static char *funcstring; /* block to allocate strings from */
-
- /* flags in argument to evaltree */
--#define EV_EXIT 01 /* exit after evaluating tree */
--#define EV_TESTED 02 /* exit status is checked; ignore -e flag */
-+#define EV_EXIT 01 /* exit after evaluating tree */
-+#define EV_TESTED 02 /* exit status is checked; ignore -e flag */
- #define EV_BACKCMD 04 /* command executing within back quotes */
-
--static const short nodesize[26] = {
-- SHELL_ALIGN(sizeof(struct ncmd)),
-- SHELL_ALIGN(sizeof(struct npipe)),
-- SHELL_ALIGN(sizeof(struct nredir)),
-- SHELL_ALIGN(sizeof(struct nredir)),
-- SHELL_ALIGN(sizeof(struct nredir)),
-- SHELL_ALIGN(sizeof(struct nbinary)),
-- SHELL_ALIGN(sizeof(struct nbinary)),
-- SHELL_ALIGN(sizeof(struct nbinary)),
-- SHELL_ALIGN(sizeof(struct nif)),
-- SHELL_ALIGN(sizeof(struct nbinary)),
-- SHELL_ALIGN(sizeof(struct nbinary)),
-- SHELL_ALIGN(sizeof(struct nfor)),
-- SHELL_ALIGN(sizeof(struct ncase)),
-- SHELL_ALIGN(sizeof(struct nclist)),
-- SHELL_ALIGN(sizeof(struct narg)),
-- SHELL_ALIGN(sizeof(struct narg)),
-- SHELL_ALIGN(sizeof(struct nfile)),
-- SHELL_ALIGN(sizeof(struct nfile)),
-- SHELL_ALIGN(sizeof(struct nfile)),
-- SHELL_ALIGN(sizeof(struct nfile)),
-- SHELL_ALIGN(sizeof(struct nfile)),
-- SHELL_ALIGN(sizeof(struct ndup)),
-- SHELL_ALIGN(sizeof(struct ndup)),
-- SHELL_ALIGN(sizeof(struct nhere)),
-- SHELL_ALIGN(sizeof(struct nhere)),
-- SHELL_ALIGN(sizeof(struct nnot)),
-+static const short nodesize[N_NUMBER] = {
-+ [NCMD ] = SHELL_ALIGN(sizeof(struct ncmd)),
-+ [NPIPE ] = SHELL_ALIGN(sizeof(struct npipe)),
-+ [NREDIR ] = SHELL_ALIGN(sizeof(struct nredir)),
-+ [NBACKGND ] = SHELL_ALIGN(sizeof(struct nredir)),
-+ [NSUBSHELL] = SHELL_ALIGN(sizeof(struct nredir)),
-+ [NAND ] = SHELL_ALIGN(sizeof(struct nbinary)),
-+ [NOR ] = SHELL_ALIGN(sizeof(struct nbinary)),
-+ [NSEMI ] = SHELL_ALIGN(sizeof(struct nbinary)),
-+ [NIF ] = SHELL_ALIGN(sizeof(struct nif)),
-+ [NWHILE ] = SHELL_ALIGN(sizeof(struct nbinary)),
-+ [NUNTIL ] = SHELL_ALIGN(sizeof(struct nbinary)),
-+ [NFOR ] = SHELL_ALIGN(sizeof(struct nfor)),
-+ [NCASE ] = SHELL_ALIGN(sizeof(struct ncase)),
-+ [NCLIST ] = SHELL_ALIGN(sizeof(struct nclist)),
-+ [NDEFUN ] = SHELL_ALIGN(sizeof(struct narg)),
-+ [NARG ] = SHELL_ALIGN(sizeof(struct narg)),
-+ [NTO ] = SHELL_ALIGN(sizeof(struct nfile)),
-+#if ENABLE_ASH_BASH_COMPAT
-+ [NTO2 ] = SHELL_ALIGN(sizeof(struct nfile)),
-+#endif
-+ [NCLOBBER ] = SHELL_ALIGN(sizeof(struct nfile)),
-+ [NFROM ] = SHELL_ALIGN(sizeof(struct nfile)),
-+ [NFROMTO ] = SHELL_ALIGN(sizeof(struct nfile)),
-+ [NAPPEND ] = SHELL_ALIGN(sizeof(struct nfile)),
-+ [NTOFD ] = SHELL_ALIGN(sizeof(struct ndup)),
-+ [NFROMFD ] = SHELL_ALIGN(sizeof(struct ndup)),
-+ [NHERE ] = SHELL_ALIGN(sizeof(struct nhere)),
-+ [NXHERE ] = SHELL_ALIGN(sizeof(struct nhere)),
-+ [NNOT ] = SHELL_ALIGN(sizeof(struct nnot)),
- };
-
- static void calcsize(union node *n);
-@@ -9065,8 +9069,6 @@
- * This implements the input routines used by the parser.
- */
-
--#define EOF_NLEFT -99 /* value of parsenleft when EOF pushed back */
--
- enum {
- INPUT_PUSH_FILE = 1,
- INPUT_NOFILE_OK = 2,
-@@ -9107,7 +9109,6 @@
- #endif
- parsenextc = sp->prevstring;
- parsenleft = sp->prevnleft;
--/*dprintf("*** calling popstring: restoring to '%s'\n", parsenextc);*/
- g_parsefile->strpush = sp->prev;
- if (sp != &(g_parsefile->basestrpush))
- free(sp);
-@@ -9123,7 +9124,7 @@
-
- #if ENABLE_FEATURE_EDITING
- retry:
-- if (!iflag || g_parsefile->fd)
-+ if (!iflag || g_parsefile->fd != STDIN_FILENO)
- nr = nonblock_safe_read(g_parsefile->fd, buf, BUFSIZ - 1);
- else {
- #if ENABLE_FEATURE_TAB_COMPLETION
-@@ -9171,55 +9172,76 @@
- * Refill the input buffer and return the next input character:
- *
- * 1) If a string was pushed back on the input, pop it;
-- * 2) If an EOF was pushed back (parsenleft == EOF_NLEFT) or we are reading
-+ * 2) If an EOF was pushed back (parsenleft < -BIGNUM) or we are reading
- * from a string so we can't refill the buffer, return EOF.
- * 3) If the is more stuff in this buffer, use it else call read to fill it.
- * 4) Process input up to the next newline, deleting nul characters.
- */
-+//#define pgetc_debug(...) bb_error_msg(__VA_ARGS__)
-+#define pgetc_debug(...) ((void)0)
- static int
- preadbuffer(void)
- {
- char *q;
- int more;
-- char savec;
-
- while (g_parsefile->strpush) {
- #if ENABLE_ASH_ALIAS
-- if (parsenleft == -1 && g_parsefile->strpush->ap &&
-- parsenextc[-1] != ' ' && parsenextc[-1] != '\t') {
-+ if (parsenleft == -1 && g_parsefile->strpush->ap
-+ && parsenextc[-1] != ' ' && parsenextc[-1] != '\t'
-+ ) {
-+ pgetc_debug("preadbuffer PEOA");
- return PEOA;
- }
- #endif
- popstring();
-+ /* try "pgetc" now: */
-+ pgetc_debug("internal pgetc at %d:%p'%s'", parsenleft, parsenextc, parsenextc);
- if (--parsenleft >= 0)
- return signed_char2int(*parsenextc++);
- }
-- if (parsenleft == EOF_NLEFT || g_parsefile->buf == NULL)
-+ /* on both branches above parsenleft < 0.
-+ * "pgetc" needs refilling.
-+ */
-+
-+ /* -90 is -BIGNUM. Below we use -99 to mark "EOF on read",
-+ * pungetc() may decrement it a few times. -90 is enough.
-+ */
-+ if (parsenleft < -90 || g_parsefile->buf == NULL) {
-+ pgetc_debug("preadbuffer PEOF1");
-+ /* even in failure keep them in lock step,
-+ * for correct pungetc. */
-+ parsenextc++;
- return PEOF;
-- flush_stdout_stderr();
-+ }
-
- more = parselleft;
- if (more <= 0) {
-+ flush_stdout_stderr();
- again:
- more = preadfd();
- if (more <= 0) {
-- parselleft = parsenleft = EOF_NLEFT;
-+ parselleft = parsenleft = -99;
-+ pgetc_debug("preadbuffer PEOF2");
-+ parsenextc++;
- return PEOF;
- }
- }
-
-+ /* Find out where's the end of line.
-+ * Set parsenleft/parselleft acordingly.
-+ * NUL chars are deleted.
-+ */
- q = parsenextc;
--
-- /* delete nul characters */
- for (;;) {
-- int c;
-+ char c;
-
- more--;
-- c = *q;
-
-- if (!c)
-+ c = *q;
-+ if (c == '\0') {
- memmove(q, q + 1, more);
-- else {
-+ } else {
- q++;
- if (c == '\n') {
- parsenleft = q - parsenextc - 1;
-@@ -9236,22 +9258,23 @@
- }
- parselleft = more;
-
-- savec = *q;
-- *q = '\0';
--
- if (vflag) {
-+ char save = *q;
-+ *q = '\0';
- out2str(parsenextc);
-+ *q = save;
- }
-
-- *q = savec;
--
-+ pgetc_debug("preadbuffer at %d:%p'%s'", parsenleft, parsenextc, parsenextc);
- return signed_char2int(*parsenextc++);
- }
-
- #define pgetc_as_macro() (--parsenleft >= 0 ? signed_char2int(*parsenextc++) : preadbuffer())
-+
- static int
- pgetc(void)
- {
-+ pgetc_debug("pgetc at %d:%p'%s'", parsenleft, parsenextc, parsenextc);
- return pgetc_as_macro();
- }
-
-@@ -9312,6 +9335,7 @@
- {
- parsenleft++;
- parsenextc--;
-+ pgetc_debug("pushed back to %d:%p'%s'", parsenleft, parsenextc, parsenextc);
- }
-
- /*
-@@ -9325,16 +9349,17 @@
- pushstring(char *s, struct alias *ap)
- {
- struct strpush *sp;
-- size_t len;
-+ int len;
-
- len = strlen(s);
- INT_OFF;
- if (g_parsefile->strpush) {
-- sp = ckzalloc(sizeof(struct strpush));
-+ sp = ckzalloc(sizeof(*sp));
- sp->prev = g_parsefile->strpush;
-- g_parsefile->strpush = sp;
-- } else
-- sp = g_parsefile->strpush = &(g_parsefile->basestrpush);
-+ } else {
-+ sp = &(g_parsefile->basestrpush);
-+ }
-+ g_parsefile->strpush = sp;
- sp->prevstring = parsenextc;
- sp->prevnleft = parsenleft;
- #if ENABLE_ASH_ALIAS
-@@ -9424,7 +9449,7 @@
- close_on_exec_on(fd);
- if (push) {
- pushfile();
-- g_parsefile->buf = 0;
-+ g_parsefile->buf = NULL;
- }
- g_parsefile->fd = fd;
- if (g_parsefile->buf == NULL)
+++ /dev/null
---- busybox-1.13.0/miscutils/inotifyd.c Thu Oct 30 08:41:37 2008
-+++ busybox-1.13.0-inotify/miscutils/inotifyd.c Fri Nov 14 22:33:27 2008
-@@ -51,6 +51,7 @@
- int inotifyd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
- int inotifyd_main(int argc UNUSED_PARAM, char **argv)
- {
-+ int n;
- unsigned mask = IN_ALL_EVENTS; // assume we want all events
- struct pollfd pfd;
- char **watched = ++argv; // watched name list
-@@ -69,7 +70,6 @@
- while (*++argv) {
- char *path = *argv;
- char *masks = strchr(path, ':');
-- int wd; // watch descriptor
- // if mask is specified ->
- if (masks) {
- *masks = '\0'; // split path and mask
-@@ -83,32 +83,39 @@
- }
- }
- // add watch
-- wd = inotify_add_watch(pfd.fd, path, mask);
-- if (wd < 0) {
-+ n = inotify_add_watch(pfd.fd, path, mask);
-+ if (n < 0)
- bb_perror_msg_and_die("add watch (%s) failed", path);
--// } else {
--// bb_error_msg("added %d [%s]:%4X", wd, path, mask);
-- }
-+ //bb_error_msg("added %d [%s]:%4X", n, path, mask);
- }
-
- // setup signals
-- bb_signals(0
-- + (1 << SIGHUP)
-- + (1 << SIGINT)
-- + (1 << SIGTERM)
-- + (1 << SIGPIPE)
-- , record_signo);
-+ bb_signals(BB_FATAL_SIGS, record_signo);
-
- // do watch
--
--// pfd.fd = fd;
- pfd.events = POLLIN;
--
-- while (!bb_got_signal && poll(&pfd, 1, -1) > 0) {
-+ while (1) {
- ssize_t len;
- void *buf;
- struct inotify_event *ie;
-
-+ again:
-+ if (bb_got_signal)
-+ break;
-+ n = poll(&pfd, 1, -1);
-+ /* Signal interrupted us? */
-+ if (n < 0 && errno == EINTR)
-+ goto again;
-+ // Under Linux, above if() is not necessary.
-+ // Non-fatal signals, e.g. SIGCHLD, when set to SIG_DFL,
-+ // are not interrupting poll().
-+ // Thus we can just break if n <= 0 (see below),
-+ // because EINTR will happen only on SIGTERM et al.
-+ // But this might be not true under other Unixes,
-+ // and is generally way too subtle to depend on.
-+ if (n <= 0) // strange error?
-+ break;
-+
- // read out all pending events
- xioctl(pfd.fd, FIONREAD, &len);
- #define eventbuf bb_common_bufsiz1
-@@ -117,21 +124,21 @@
- // process events. N.B. events may vary in length
- while (len > 0) {
- int i;
-- char events[12];
-+ char events[sizeof(mask_names)];
- char *s = events;
- unsigned m = ie->mask;
-
-- for (i = 0; i < 12; ++i, m >>= 1) {
-- if (m & 1) {
-+ for (i = 0; i < sizeof(mask_names)-1; ++i, m >>= 1) {
-+ if (m & 1)
- *s++ = mask_names[i];
-- }
- }
- *s = '\0';
--// bb_error_msg("exec %s %08X\t%s\t%s\t%s", agent, ie->mask, events, watched[ie->wd], ie->len ? ie->name : "");
-+ //bb_error_msg("exec %s %08X\t%s\t%s\t%s", agent,
-+ // ie->mask, events, watched[ie->wd], ie->len ? ie->name : "");
- args[1] = events;
- args[2] = watched[ie->wd];
- args[3] = ie->len ? ie->name : NULL;
-- xspawn((char **)args);
-+ wait4pid(xspawn((char **)args));
- // next event
- i = sizeof(struct inotify_event) + ie->len;
- len -= i;