Some adjustments, mostly from David McCullough <davidm@lineo.com> to
make busybox be more uClinux friendly.  I also adjusted Config.h for
uClinux so it will automagically disable apps the arn't going to
work without fork() and such.
 -Erik
diff --git a/Config.h b/Config.h
index 00294f7..1daf65c 100644
--- a/Config.h
+++ b/Config.h
@@ -417,6 +417,19 @@
 // Nothing beyond this point should ever be touched by 
 // mere mortals so leave this stuff alone.
 //
+#include <features.h>
+#if defined __UCLIBC__ && ! defined __UCLIBC_HAS_MMU__
+	#undef BB_RPM2CPIO		/* Uses gz_open(), which uses fork() */
+	#undef BB_DPKG_DEB		/* Uses gz_open(), which uses fork() */
+	#undef BB_FEATURE_ASH	/* Uses fork() */
+	#undef BB_FEATURE_HUSH	/* Uses fork() */
+	#undef BB_FEATURE_LASH	/* Uses fork() */
+	#undef BB_INIT			/* Uses fork() */
+	#undef BB_FEATURE_TAR_GZIP	/* Uses fork() */
+	#undef BB_SYSLOGD		/* Uses daemon() */
+	#undef BB_KLOGD			/* Uses daemon() */
+	#undef BB_UPDATE		/* Uses daemon() */
+#endif
 #if defined BB_SH
 	#if defined BB_FEATURE_COMMAND_EDITING 
 		#define BB_CMDEDIT
diff --git a/Makefile b/Makefile
index 2b31895..8b4c16f 100644
--- a/Makefile
+++ b/Makefile
@@ -396,7 +396,7 @@
 	    docs/busybox.lineo.com/BusyBox.html
 	- rm -f docs/busybox.txt docs/busybox.dvi docs/busybox.ps \
 	    docs/busybox.pdf docs/busybox.lineo.com/busybox.html
-	- rm -f multibuild.log Config.h.orig
+	- rm -f multibuild.log Config.h.orig *.gdb *.elf
 	- rm -rf docs/busybox _install libpwd.a libbb.a pod2htm*
 	- rm -f busybox.links libbb/loop.h *~ slist.mk core applet_source_list
 	- find -name \*.o -exec rm -f {} \;
diff --git a/coreutils/ls.c b/coreutils/ls.c
index bd79cc9..1019147 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -303,6 +303,7 @@
 	return(p);
 }
 
+#ifdef BB_FEATURE_LS_RECURSIVE
 static void dfree(struct dnode **dnp)
 {
 	struct dnode *cur, *next;
@@ -318,6 +319,7 @@
 	}
 	free(dnp);	/* free the array holding the dnode pointers */
 }
+#endif
 
 static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
 {
diff --git a/coreutils/uudecode.c b/coreutils/uudecode.c
index 6a3f78a..6ac9f1b 100644
--- a/coreutils/uudecode.c
+++ b/coreutils/uudecode.c
@@ -207,6 +207,8 @@
   char buf[2 * BUFSIZ];
   char *outname;
   int do_base64 = 0;
+  int res;
+  int dofre;
 
   /* Search for header line.  */
 
@@ -226,6 +228,7 @@
   }
 
   /* If the output file name is given on the command line this rules.  */
+  dofre = FALSE;
   if (forced_outname != NULL)
     outname = (char *) forced_outname;
   else {
@@ -248,10 +251,11 @@
       }
       n = strlen (pw->pw_dir);
       n1 = strlen (p);
-      outname = (char *) alloca ((size_t) (n + n1 + 2));
+      outname = (char *) xmalloc ((size_t) (n + n1 + 2));
       memcpy (outname + n + 1, p, (size_t) (n1 + 1));
       memcpy (outname, pw->pw_dir, (size_t) n);
       outname[n] = '/';
+      dofre = TRUE;
     }
   }
 
@@ -261,6 +265,8 @@
 	  || chmod (outname, mode & (S_IRWXU | S_IRWXG | S_IRWXO))
          )) {
     perror_msg("%s", outname); /* */
+    if (dofre)
+	free(outname);
     return FALSE;
   }
 
@@ -269,9 +275,12 @@
 
   /* For each input line:  */
   if (do_base64)
-    return read_base64 (inname);
+      res = read_base64 (inname);
   else
-    return read_stduu (inname);
+       res = read_stduu (inname);
+  if (dofre)
+      free(outname);
+  return res;
 }
 
 int uudecode_main (int argc,
diff --git a/editors/vi.c b/editors/vi.c
index f75c884..cfdc29f 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -19,7 +19,7 @@
  */
 
 static const char vi_Version[] =
-	"$Id: vi.c,v 1.12 2001/07/17 01:12:36 andersen Exp $";
+	"$Id: vi.c,v 1.13 2001/07/19 22:28:01 andersen Exp $";
 
 /*
  * To compile for standalone use:
@@ -3554,7 +3554,7 @@
 	}
 	charcnt = 0;
 	// FIXIT- use the correct umask()
-	fd = open((char *) fn, (O_RDWR | O_CREAT | O_TRUNC), 0664);
+	fd = open((char *) fn, (O_WRONLY | O_CREAT | O_TRUNC), 0664);
 	if (fd < 0)
 		return (-1);
 	cnt = last - first + 1;
diff --git a/kill.c b/kill.c
index 8745f63..34cbc4d 100644
--- a/kill.c
+++ b/kill.c
@@ -147,9 +147,8 @@
 					const struct signal_name *s = signames;
 
 					while (s->name != 0) {
-						col +=
-							fprintf(stderr, "%2d) %-8s", s->number,
-									(s++)->name);
+						col += fprintf(stderr, "%2d) %-8s", s->number, s->name);
+						s++;
 						if (col > 60) {
 							fprintf(stderr, "\n");
 							col = 0;
diff --git a/libbb/gz_open.c b/libbb/gz_open.c
index b23920b..ef30ff8 100644
--- a/libbb/gz_open.c
+++ b/libbb/gz_open.c
@@ -15,7 +15,7 @@
 		return(NULL);
 	}
 	if ((*pid = fork()) == -1) {
-		error_msg("fork failured");
+		error_msg("fork failed");
 		return(NULL);
 	}
 	if (*pid==0) {
@@ -29,7 +29,7 @@
 	}
 	close(unzip_pipe[1]);
 	if (unzip_pipe[0] == -1) {
-		error_msg("Couldnt initialise gzip stream");
+		error_msg("gzip stream init failed");
 	}
 	return(fdopen(unzip_pipe[0], "r"));
 }
diff --git a/libbb/interface.c b/libbb/interface.c
index 8eb03a6..484597c 100644
--- a/libbb/interface.c
+++ b/libbb/interface.c
@@ -3,7 +3,7 @@
  *              that either displays or sets the characteristics of
  *              one or more of the system's networking interfaces.
  *
- * Version:     $Id: interface.c,v 1.3 2001/06/01 21:47:15 andersen Exp $
+ * Version:     $Id: interface.c,v 1.4 2001/07/19 22:28:02 andersen Exp $
  *
  * Author:      Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
  *              and others.  Copyright 1993 MicroWalt Corporation
@@ -78,7 +78,9 @@
 #include <netdb.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
+#if 0
 #include <arpa/nameser.h>
+#endif
 #include "libbb.h"
 
 #define _(x) x
@@ -455,9 +457,11 @@
 #ifdef DEBUG
 	fprintf (stderr, "getnetbyaddr (%08lx)\n", host_ad);
 #endif
+#if 0
 	np = getnetbyaddr(host_ad, AF_INET);
 	if (np != NULL)
 	    safe_strncpy(name, np->n_name, len);
+#endif
     }
     if ((ent == NULL) && (np == NULL))
 	safe_strncpy(name, inet_ntoa(s_in->sin_addr), len);
@@ -1068,7 +1072,6 @@
     struct ifconf ifc;
     struct ifreq *ifr;
     int n, err = -1;
-    /* XXX Should this re-use the global skfd? */
     int skfd2;
 
     /* SIOCGIFCONF currently seems to only work properly on AF_INET sockets
diff --git a/logger.c b/logger.c
index b8aae3d..623a4f9 100644
--- a/logger.c
+++ b/logger.c
@@ -127,14 +127,20 @@
 		}
 	}
 
+	openlog(name, option, (pri | LOG_FACMASK));
 	if (optind == argc) {
-		/* read from stdin */
-		i = 0;
-		while ((c = getc(stdin)) != EOF && i < sizeof(buf)) {
-			buf[i++] = c;
-		}
-		buf[i++] = '\0';
-		message = buf;
+		do {
+			/* read from stdin */
+			i = 0;
+			while ((c = getc(stdin)) != EOF && c != '\n' && 
+					i < (sizeof(buf)-1)) {
+				buf[i++] = c;
+			}
+			if (i > 0) {
+				buf[i++] = '\0';
+				syslog(pri, "%s", buf);
+			}
+		} while (c != EOF);
 	} else {
 		len = 1; /* for the '\0' */
 		message=xcalloc(1, 1);
@@ -146,12 +152,10 @@
 			strcat(message, " ");
 		}
 		message[strlen(message)-1] = '\0';
+		syslog(pri, "%s", message);
 	}
 
-	/*openlog(name, option, (pri | LOG_FACMASK));
-	syslog(pri, "%s", message);
-	closelog();*/
-	syslog_msg_with_name(name,(pri | LOG_FACMASK),pri,message);
+	closelog();
 	return EXIT_SUCCESS;
 }
 
diff --git a/ls.c b/ls.c
index bd79cc9..1019147 100644
--- a/ls.c
+++ b/ls.c
@@ -303,6 +303,7 @@
 	return(p);
 }
 
+#ifdef BB_FEATURE_LS_RECURSIVE
 static void dfree(struct dnode **dnp)
 {
 	struct dnode *cur, *next;
@@ -318,6 +319,7 @@
 	}
 	free(dnp);	/* free the array holding the dnode pointers */
 }
+#endif
 
 static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
 {
diff --git a/miscutils/update.c b/miscutils/update.c
index a6550b0..603740e 100644
--- a/miscutils/update.c
+++ b/miscutils/update.c
@@ -65,46 +65,44 @@
 				show_usage();
 		}
 	}
+	
+	if (daemon(0, 1) < 0)
+		perror_msg_and_die("daemon");
 
-	pid = fork();
-	if (pid < 0)
-		return EXIT_FAILURE;
-	else if (pid == 0) {
-		/* Become a proper daemon */
-		setsid();
-		chdir("/");
+	/* Become a proper daemon */
+	setsid();
+	chdir("/");
 #ifdef OPEN_MAX
-		for (pid = 0; pid < OPEN_MAX; pid++) close(pid);
+	for (pid = 0; pid < OPEN_MAX; pid++) close(pid);
 #else
-		/* glibc 2.1.92 requires using sysconf(_SC_OPEN_MAX) */
-		for (pid = 0; pid < sysconf(_SC_OPEN_MAX); pid++) close(pid);
+	/* glibc 2.1.92 requires using sysconf(_SC_OPEN_MAX) */
+	for (pid = 0; pid < sysconf(_SC_OPEN_MAX); pid++) close(pid);
 #endif
 
-		/*
-		 * This is no longer necessary since 1.3.5x, but it will harmlessly
-		 * exit if that is the case.
-		 */
+	/* This is no longer necessary since 1.3.5x, but it will harmlessly
+	 * exit if that is the case.
+	 */
 
-		/* set the program name that will show up in a 'ps' listing */
-		argv[0] = "bdflush (update)";
-		argv[1] = NULL;
-		argv[2] = NULL;
-		for (;;) {
-			if (use_sync) {
-				sleep(sync_duration);
-				sync();
-			} else {
-				sleep(flush_duration);
-				if (bdflush(1, 0) < 0) {
-					openlog("update", LOG_CONS, LOG_DAEMON);
-					syslog(LOG_INFO,
-						   "This kernel does not need update(8). Exiting.");
-					closelog();
-					return EXIT_SUCCESS;
-				}
+	/* set the program name that will show up in a 'ps' listing */
+	argv[0] = "bdflush (update)";
+	argv[1] = NULL;
+	argv[2] = NULL;
+	for (;;) {
+		if (use_sync) {
+			sleep(sync_duration);
+			sync();
+		} else {
+			sleep(flush_duration);
+			if (bdflush(1, 0) < 0) {
+				openlog("update", LOG_CONS, LOG_DAEMON);
+				syslog(LOG_INFO,
+						"This kernel does not need update(8). Exiting.");
+				closelog();
+				return EXIT_SUCCESS;
 			}
 		}
 	}
+
 	return EXIT_SUCCESS;
 }
 
diff --git a/networking/wget.c b/networking/wget.c
index 009e0c8..59373d1 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -56,12 +56,12 @@
 static FILE *open_socket(char *host, int port);
 static char *gethdr(char *buf, size_t bufsiz, FILE *fp, int *istrunc);
 static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf);
-static void progressmeter(int flag);
 
 /* Globals (can be accessed from signal handlers */
 static off_t filesize = 0;		/* content-length of the file */
 static int chunked = 0;			/* chunked transfer encoding */
 #ifdef BB_FEATURE_WGET_STATUSBAR
+static void progressmeter(int flag);
 static char *curfile;			/* Name of current file being transferred. */
 static struct timeval start;	/* Time a transfer started. */
 static volatile unsigned long statbytes = 0; /* Number of bytes transferred so far. */
@@ -817,7 +817,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: wget.c,v 1.44 2001/07/19 19:13:55 kraai Exp $
+ *	$Id: wget.c,v 1.45 2001/07/19 22:28:01 andersen Exp $
  */
 
 
diff --git a/procps/kill.c b/procps/kill.c
index 8745f63..34cbc4d 100644
--- a/procps/kill.c
+++ b/procps/kill.c
@@ -147,9 +147,8 @@
 					const struct signal_name *s = signames;
 
 					while (s->name != 0) {
-						col +=
-							fprintf(stderr, "%2d) %-8s", s->number,
-									(s++)->name);
+						col += fprintf(stderr, "%2d) %-8s", s->number, s->name);
+						s++;
 						if (col > 60) {
 							fprintf(stderr, "\n");
 							col = 0;
diff --git a/sysklogd/logger.c b/sysklogd/logger.c
index b8aae3d..623a4f9 100644
--- a/sysklogd/logger.c
+++ b/sysklogd/logger.c
@@ -127,14 +127,20 @@
 		}
 	}
 
+	openlog(name, option, (pri | LOG_FACMASK));
 	if (optind == argc) {
-		/* read from stdin */
-		i = 0;
-		while ((c = getc(stdin)) != EOF && i < sizeof(buf)) {
-			buf[i++] = c;
-		}
-		buf[i++] = '\0';
-		message = buf;
+		do {
+			/* read from stdin */
+			i = 0;
+			while ((c = getc(stdin)) != EOF && c != '\n' && 
+					i < (sizeof(buf)-1)) {
+				buf[i++] = c;
+			}
+			if (i > 0) {
+				buf[i++] = '\0';
+				syslog(pri, "%s", buf);
+			}
+		} while (c != EOF);
 	} else {
 		len = 1; /* for the '\0' */
 		message=xcalloc(1, 1);
@@ -146,12 +152,10 @@
 			strcat(message, " ");
 		}
 		message[strlen(message)-1] = '\0';
+		syslog(pri, "%s", message);
 	}
 
-	/*openlog(name, option, (pri | LOG_FACMASK));
-	syslog(pri, "%s", message);
-	closelog();*/
-	syslog_msg_with_name(name,(pri | LOG_FACMASK),pri,message);
+	closelog();
 	return EXIT_SUCCESS;
 }
 
diff --git a/update.c b/update.c
index a6550b0..603740e 100644
--- a/update.c
+++ b/update.c
@@ -65,46 +65,44 @@
 				show_usage();
 		}
 	}
+	
+	if (daemon(0, 1) < 0)
+		perror_msg_and_die("daemon");
 
-	pid = fork();
-	if (pid < 0)
-		return EXIT_FAILURE;
-	else if (pid == 0) {
-		/* Become a proper daemon */
-		setsid();
-		chdir("/");
+	/* Become a proper daemon */
+	setsid();
+	chdir("/");
 #ifdef OPEN_MAX
-		for (pid = 0; pid < OPEN_MAX; pid++) close(pid);
+	for (pid = 0; pid < OPEN_MAX; pid++) close(pid);
 #else
-		/* glibc 2.1.92 requires using sysconf(_SC_OPEN_MAX) */
-		for (pid = 0; pid < sysconf(_SC_OPEN_MAX); pid++) close(pid);
+	/* glibc 2.1.92 requires using sysconf(_SC_OPEN_MAX) */
+	for (pid = 0; pid < sysconf(_SC_OPEN_MAX); pid++) close(pid);
 #endif
 
-		/*
-		 * This is no longer necessary since 1.3.5x, but it will harmlessly
-		 * exit if that is the case.
-		 */
+	/* This is no longer necessary since 1.3.5x, but it will harmlessly
+	 * exit if that is the case.
+	 */
 
-		/* set the program name that will show up in a 'ps' listing */
-		argv[0] = "bdflush (update)";
-		argv[1] = NULL;
-		argv[2] = NULL;
-		for (;;) {
-			if (use_sync) {
-				sleep(sync_duration);
-				sync();
-			} else {
-				sleep(flush_duration);
-				if (bdflush(1, 0) < 0) {
-					openlog("update", LOG_CONS, LOG_DAEMON);
-					syslog(LOG_INFO,
-						   "This kernel does not need update(8). Exiting.");
-					closelog();
-					return EXIT_SUCCESS;
-				}
+	/* set the program name that will show up in a 'ps' listing */
+	argv[0] = "bdflush (update)";
+	argv[1] = NULL;
+	argv[2] = NULL;
+	for (;;) {
+		if (use_sync) {
+			sleep(sync_duration);
+			sync();
+		} else {
+			sleep(flush_duration);
+			if (bdflush(1, 0) < 0) {
+				openlog("update", LOG_CONS, LOG_DAEMON);
+				syslog(LOG_INFO,
+						"This kernel does not need update(8). Exiting.");
+				closelog();
+				return EXIT_SUCCESS;
 			}
 		}
 	}
+
 	return EXIT_SUCCESS;
 }
 
diff --git a/uudecode.c b/uudecode.c
index 6a3f78a..6ac9f1b 100644
--- a/uudecode.c
+++ b/uudecode.c
@@ -207,6 +207,8 @@
   char buf[2 * BUFSIZ];
   char *outname;
   int do_base64 = 0;
+  int res;
+  int dofre;
 
   /* Search for header line.  */
 
@@ -226,6 +228,7 @@
   }
 
   /* If the output file name is given on the command line this rules.  */
+  dofre = FALSE;
   if (forced_outname != NULL)
     outname = (char *) forced_outname;
   else {
@@ -248,10 +251,11 @@
       }
       n = strlen (pw->pw_dir);
       n1 = strlen (p);
-      outname = (char *) alloca ((size_t) (n + n1 + 2));
+      outname = (char *) xmalloc ((size_t) (n + n1 + 2));
       memcpy (outname + n + 1, p, (size_t) (n1 + 1));
       memcpy (outname, pw->pw_dir, (size_t) n);
       outname[n] = '/';
+      dofre = TRUE;
     }
   }
 
@@ -261,6 +265,8 @@
 	  || chmod (outname, mode & (S_IRWXU | S_IRWXG | S_IRWXO))
          )) {
     perror_msg("%s", outname); /* */
+    if (dofre)
+	free(outname);
     return FALSE;
   }
 
@@ -269,9 +275,12 @@
 
   /* For each input line:  */
   if (do_base64)
-    return read_base64 (inname);
+      res = read_base64 (inname);
   else
-    return read_stduu (inname);
+       res = read_stduu (inname);
+  if (dofre)
+      free(outname);
+  return res;
 }
 
 int uudecode_main (int argc,
diff --git a/vi.c b/vi.c
index f75c884..cfdc29f 100644
--- a/vi.c
+++ b/vi.c
@@ -19,7 +19,7 @@
  */
 
 static const char vi_Version[] =
-	"$Id: vi.c,v 1.12 2001/07/17 01:12:36 andersen Exp $";
+	"$Id: vi.c,v 1.13 2001/07/19 22:28:01 andersen Exp $";
 
 /*
  * To compile for standalone use:
@@ -3554,7 +3554,7 @@
 	}
 	charcnt = 0;
 	// FIXIT- use the correct umask()
-	fd = open((char *) fn, (O_RDWR | O_CREAT | O_TRUNC), 0664);
+	fd = open((char *) fn, (O_WRONLY | O_CREAT | O_TRUNC), 0664);
 	if (fd < 0)
 		return (-1);
 	cnt = last - first + 1;
diff --git a/wget.c b/wget.c
index 009e0c8..59373d1 100644
--- a/wget.c
+++ b/wget.c
@@ -56,12 +56,12 @@
 static FILE *open_socket(char *host, int port);
 static char *gethdr(char *buf, size_t bufsiz, FILE *fp, int *istrunc);
 static int ftpcmd(char *s1, char *s2, FILE *fp, char *buf);
-static void progressmeter(int flag);
 
 /* Globals (can be accessed from signal handlers */
 static off_t filesize = 0;		/* content-length of the file */
 static int chunked = 0;			/* chunked transfer encoding */
 #ifdef BB_FEATURE_WGET_STATUSBAR
+static void progressmeter(int flag);
 static char *curfile;			/* Name of current file being transferred. */
 static struct timeval start;	/* Time a transfer started. */
 static volatile unsigned long statbytes = 0; /* Number of bytes transferred so far. */
@@ -817,7 +817,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$Id: wget.c,v 1.44 2001/07/19 19:13:55 kraai Exp $
+ *	$Id: wget.c,v 1.45 2001/07/19 22:28:01 andersen Exp $
  */