Some updates for the day,
 -Erik
diff --git a/Changelog b/Changelog
index 68a1101..98e82df 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,17 @@
+0.43
+	* Wrote basename
+	* tar wouldn't create directory entries that don't end in '/',
+	    now it does (fix thanks to Avery Pennarun <apenwarr@worldvisions.ca>)
+	* Several fixes from Pavel Roskin <pavel_roskin@geocities.com>:
+	    -  When `tail' fails to open a file it now exits.
+	    - When `syslogd' is given the `-n' option it should still use 
+		fork() for running klogd.
+	* nslookup types are now changed to u_int32_t (instead of uint32_t)
+	    changed per a patch from Pascal Bellard <pascal.bellard@ascend.com>
+
+	-Erik Andersen
+
+
 0.42
 
         * Fairly massive restructuring of umount.c to deal with remounting 
diff --git a/Makefile b/Makefile
index 10b76ee..8a71beb 100644
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@
 #
 
 # PROG      := busybox
-VERSION   := 0.42
+VERSION   := 0.43
 BUILDTIME := $(shell TZ=GMT date "+%Y%m%d-%H%M")
 
 # Set the following to `true' to make a debuggable build.
@@ -89,7 +89,7 @@
 endif
 
 LIBRARIES =
-OBJECTS   = $(shell ./busybox.sh) messages.o utility.o
+OBJECTS   = $(shell ./busybox.sh) busybox.o messages.o utility.o
 CFLAGS    += -DBB_VER='"$(VERSION)"'
 CFLAGS    += -DBB_BT='"$(BUILDTIME)"'
 ifdef BB_INIT_SCRIPT
diff --git a/TODO b/TODO
index b6f565f..bcba294 100644
--- a/TODO
+++ b/TODO
@@ -24,10 +24,29 @@
 * killall
 * stty
 * tr
+* cut
 * expr (maybe?)  (ash builtin?)
 
 
 
+-----------------------
+
+
+busybox.defs.h is too big and hard to follow.
+
+I either need to add a better build system (like the Linux kernel?)
+or I need to split up busybox.defs.h into coherent chunks (i.e.
+busybox.defs.h just has a bunch of: 
+
+#include "fileutils.h"
+#include "shellutils.h"
+
+which would then have smaller sets of #defines...
+Hmm.  Needs to be carefully thought out.
+
+-----------------------
+
+
 
 Some known bugs, todo items, etc...
 
@@ -67,3 +86,22 @@
 There is no exclude file(s) option to tar. LRP's packaging system can not
 function without this. Will you have the time to add this soon?
 
+
+-----------------------
+
+
+/bin/busybox --install -s    which makes all links to commands that it
+  can support (an optionnal -s should be used for symbolic links instead
+  of hard links).
+
+-----------------------
+
+cd /mnt
+mkdir BACKUP
+mv * BACKUP
+
+Today, "mv" behaved as a cp -a and my disk becomed full. It does not
+work properly either when renaming a directory into something else
+(it produces a lot of disk activity when doing this).
+
+
diff --git a/applets/busybox.c b/applets/busybox.c
index 8bbe6a2..a013f8c 100644
--- a/applets/busybox.c
+++ b/applets/busybox.c
@@ -37,6 +37,9 @@
 
 static const struct Applet applets[] = {
 
+#ifdef BB_BASENAME				//usr/bin/basename
+	{"basename", basename_main},
+#endif
 #ifdef BB_BUSYBOX				//bin
 	{"busybox", busybox_main},
 #endif
diff --git a/archival/tar.c b/archival/tar.c
index 87b5d21..8f802de 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -596,6 +596,12 @@
 	 */
 	if (S_ISDIR(mode)) {
 		if (createPath(outName, mode) == TRUE) {
+			/* make the final component, just in case it was
+			 * omitted by createPath() (which will skip the
+			 * directory if it doesn't have a terminating '/')
+			 */
+			mkdir(outName, mode);
+
 			/* Set the file time */
 			utb.actime = mtime;
 			utb.modtime = mtime;
diff --git a/busybox.c b/busybox.c
index 8bbe6a2..a013f8c 100644
--- a/busybox.c
+++ b/busybox.c
@@ -37,6 +37,9 @@
 
 static const struct Applet applets[] = {
 
+#ifdef BB_BASENAME				//usr/bin/basename
+	{"basename", basename_main},
+#endif
 #ifdef BB_BUSYBOX				//bin
 	{"busybox", busybox_main},
 #endif
diff --git a/busybox.def.h b/busybox.def.h
index e2f5dd3..e531f1f 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -7,7 +7,7 @@
 //
 //
 // BusyBox Applications
-#define BB_BUSYBOX
+//#define BB_BASENAME
 #define BB_CAT
 #define BB_CHMOD_CHOWN_CHGRP
 #define BB_CHROOT
diff --git a/busybox.spec b/busybox.spec
index 03e4feb..dc03da0 100644
--- a/busybox.spec
+++ b/busybox.spec
@@ -1,5 +1,5 @@
 Name: busybox
-Version: 0.42
+Version: 0.43
 Release: 1
 Group: System/Utilities
 Summary: BusyBox is a tiny suite of Unix utilities in a multi-call binary.
diff --git a/coreutils/tail.c b/coreutils/tail.c
index 821244f..5e05fe8 100644
--- a/coreutils/tail.c
+++ b/coreutils/tail.c
@@ -330,7 +330,7 @@
 		/* Not standard input.  */
 		fd = open(filename, O_RDONLY);
 		if (fd == -1)
-			errorMsg("open error");
+			fatalError("open error");
 
 		errors = tail_lines(filename, fd, (long) n_units);
 		close(fd);
diff --git a/examples/busybox.spec b/examples/busybox.spec
index 03e4feb..dc03da0 100644
--- a/examples/busybox.spec
+++ b/examples/busybox.spec
@@ -1,5 +1,5 @@
 Name: busybox
-Version: 0.42
+Version: 0.43
 Release: 1
 Group: System/Utilities
 Summary: BusyBox is a tiny suite of Unix utilities in a multi-call binary.
diff --git a/init.c b/init.c
index b59e9a1..a3e165e 100644
--- a/init.c
+++ b/init.c
@@ -118,7 +118,7 @@
 static char *secondConsole = VT_SECONDARY;
 static char *log = VT_LOG;
 static int kernelVersion = 0;
-static char termType[32] = "TERM=ansi";
+static char termType[32] = "TERM=linux";
 static char console[32] = _PATH_CONSOLE;
 static void delete_initAction(initAction * action);
 
@@ -314,6 +314,8 @@
 		if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
 			log = NULL;
 			secondConsole = NULL;
+			/* Force the TERM setting to vt102 for serial console */
+			snprintf(termType, sizeof(termType) - 1, "TERM=vt102");
 			message(LOG | CONSOLE,
 					"serial console detected.  Disabling virtual terminals.\r\n");
 		}
@@ -839,11 +841,11 @@
 
 	/* Hello world */
 #ifndef DEBUG_INIT
-	message(LOG | CONSOLE,
+	message(LOG,
 			"init started:  BusyBox v%s (%s) multi-call binary\r\n",
 			BB_VER, BB_BT);
 #else
-	message(LOG | CONSOLE,
+	message(LOG,
 			"init(%d) started:  BusyBox v%s (%s) multi-call binary\r\n",
 			getpid(), BB_VER, BB_BT);
 #endif
@@ -851,7 +853,7 @@
 
 	/* Mount /proc */
 	if (mount("proc", "/proc", "proc", 0, 0) == 0) {
-		message(LOG | CONSOLE, "Mounting /proc: done.\n");
+		message(LOG, "Mounting /proc: done.\n");
 		kernelVersion = get_kernel_revision();
 	} else
 		message(LOG | CONSOLE, "Mounting /proc: failed!\n");
diff --git a/init/init.c b/init/init.c
index b59e9a1..a3e165e 100644
--- a/init/init.c
+++ b/init/init.c
@@ -118,7 +118,7 @@
 static char *secondConsole = VT_SECONDARY;
 static char *log = VT_LOG;
 static int kernelVersion = 0;
-static char termType[32] = "TERM=ansi";
+static char termType[32] = "TERM=linux";
 static char console[32] = _PATH_CONSOLE;
 static void delete_initAction(initAction * action);
 
@@ -314,6 +314,8 @@
 		if (ioctl(0, TIOCGSERIAL, &sr) == 0) {
 			log = NULL;
 			secondConsole = NULL;
+			/* Force the TERM setting to vt102 for serial console */
+			snprintf(termType, sizeof(termType) - 1, "TERM=vt102");
 			message(LOG | CONSOLE,
 					"serial console detected.  Disabling virtual terminals.\r\n");
 		}
@@ -839,11 +841,11 @@
 
 	/* Hello world */
 #ifndef DEBUG_INIT
-	message(LOG | CONSOLE,
+	message(LOG,
 			"init started:  BusyBox v%s (%s) multi-call binary\r\n",
 			BB_VER, BB_BT);
 #else
-	message(LOG | CONSOLE,
+	message(LOG,
 			"init(%d) started:  BusyBox v%s (%s) multi-call binary\r\n",
 			getpid(), BB_VER, BB_BT);
 #endif
@@ -851,7 +853,7 @@
 
 	/* Mount /proc */
 	if (mount("proc", "/proc", "proc", 0, 0) == 0) {
-		message(LOG | CONSOLE, "Mounting /proc: done.\n");
+		message(LOG, "Mounting /proc: done.\n");
 		kernelVersion = get_kernel_revision();
 	} else
 		message(LOG | CONSOLE, "Mounting /proc: failed!\n");
diff --git a/internal.h b/internal.h
index c2e77d4..5b71560 100644
--- a/internal.h
+++ b/internal.h
@@ -57,6 +57,7 @@
 	int	(*main)(int argc, char** argv);
 };
 
+extern int basename_main(int argc, char **argv);
 extern int busybox_main(int argc, char** argv);
 extern int block_device_main(int argc, char** argv);
 extern int cat_main(int argc, char** argv);
diff --git a/networking/nslookup.c b/networking/nslookup.c
index ffa7201..e2d8cea 100644
--- a/networking/nslookup.c
+++ b/networking/nslookup.c
@@ -58,9 +58,9 @@
 /* only works for IPv4 */
 static int addr_fprint(char *addr, FILE * dst)
 {
-	uint8_t split[4];
-	uint32_t ip;
-	uint32_t *x = (uint32_t *) addr;
+	u_int8_t split[4];
+	u_int32_t ip;
+	u_int32_t *x = (u_int32_t *) addr;
 
 	ip = ntohl(*x);
 	split[0] = (ip & 0xff000000) >> 24;
@@ -73,12 +73,12 @@
 }
 
 /* changes a c-string matching the perl regex \d+\.\d+\.\d+\.\d+
- * into a uint32_t
+ * into a u_int32_t
  */
-static uint32_t str_to_addr(const char *addr)
+static u_int32_t str_to_addr(const char *addr)
 {
-	uint32_t split[4];
-	uint32_t ip;
+	u_int32_t split[4];
+	u_int32_t ip;
 
 	sscanf(addr, "%d.%d.%d.%d",
 		   &split[0], &split[1], &split[2], &split[3]);
@@ -174,4 +174,4 @@
 	return 0;
 }
 
-/* $Id: nslookup.c,v 1.4 2000/02/08 19:58:47 erik Exp $ */
+/* $Id: nslookup.c,v 1.5 2000/02/18 21:34:17 erik Exp $ */
diff --git a/nslookup.c b/nslookup.c
index ffa7201..e2d8cea 100644
--- a/nslookup.c
+++ b/nslookup.c
@@ -58,9 +58,9 @@
 /* only works for IPv4 */
 static int addr_fprint(char *addr, FILE * dst)
 {
-	uint8_t split[4];
-	uint32_t ip;
-	uint32_t *x = (uint32_t *) addr;
+	u_int8_t split[4];
+	u_int32_t ip;
+	u_int32_t *x = (u_int32_t *) addr;
 
 	ip = ntohl(*x);
 	split[0] = (ip & 0xff000000) >> 24;
@@ -73,12 +73,12 @@
 }
 
 /* changes a c-string matching the perl regex \d+\.\d+\.\d+\.\d+
- * into a uint32_t
+ * into a u_int32_t
  */
-static uint32_t str_to_addr(const char *addr)
+static u_int32_t str_to_addr(const char *addr)
 {
-	uint32_t split[4];
-	uint32_t ip;
+	u_int32_t split[4];
+	u_int32_t ip;
 
 	sscanf(addr, "%d.%d.%d.%d",
 		   &split[0], &split[1], &split[2], &split[3]);
@@ -174,4 +174,4 @@
 	return 0;
 }
 
-/* $Id: nslookup.c,v 1.4 2000/02/08 19:58:47 erik Exp $ */
+/* $Id: nslookup.c,v 1.5 2000/02/18 21:34:17 erik Exp $ */
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index d39cd6a..3e35df1 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -365,6 +365,17 @@
 		*p++ = '\0';
 	}
 
+#ifdef BB_KLOGD
+	/* Start up the klogd process */
+	if (startKlogd == TRUE) {
+		klogd_pid = fork();
+		if (klogd_pid == 0) {
+			strncpy(argv[0], "klogd", strlen(argv[0]));
+			doKlogd();
+		}
+	}
+#endif
+
 	if (doFork == TRUE) {
 		pid = fork();
 		if (pid < 0)
@@ -377,16 +388,5 @@
 		doSyslogd();
 	}
 
-#ifdef BB_KLOGD
-	/* Start up the klogd process */
-	if (startKlogd == TRUE) {
-		klogd_pid = fork();
-		if (klogd_pid == 0) {
-			strncpy(argv[0], "klogd", strlen(argv[0]));
-			doKlogd();
-		}
-	}
-#endif
-
 	exit(TRUE);
 }
diff --git a/syslogd.c b/syslogd.c
index d39cd6a..3e35df1 100644
--- a/syslogd.c
+++ b/syslogd.c
@@ -365,6 +365,17 @@
 		*p++ = '\0';
 	}
 
+#ifdef BB_KLOGD
+	/* Start up the klogd process */
+	if (startKlogd == TRUE) {
+		klogd_pid = fork();
+		if (klogd_pid == 0) {
+			strncpy(argv[0], "klogd", strlen(argv[0]));
+			doKlogd();
+		}
+	}
+#endif
+
 	if (doFork == TRUE) {
 		pid = fork();
 		if (pid < 0)
@@ -377,16 +388,5 @@
 		doSyslogd();
 	}
 
-#ifdef BB_KLOGD
-	/* Start up the klogd process */
-	if (startKlogd == TRUE) {
-		klogd_pid = fork();
-		if (klogd_pid == 0) {
-			strncpy(argv[0], "klogd", strlen(argv[0]));
-			doKlogd();
-		}
-	}
-#endif
-
 	exit(TRUE);
 }
diff --git a/tail.c b/tail.c
index 821244f..5e05fe8 100644
--- a/tail.c
+++ b/tail.c
@@ -330,7 +330,7 @@
 		/* Not standard input.  */
 		fd = open(filename, O_RDONLY);
 		if (fd == -1)
-			errorMsg("open error");
+			fatalError("open error");
 
 		errors = tail_lines(filename, fd, (long) n_units);
 		close(fd);
diff --git a/tar.c b/tar.c
index 87b5d21..8f802de 100644
--- a/tar.c
+++ b/tar.c
@@ -596,6 +596,12 @@
 	 */
 	if (S_ISDIR(mode)) {
 		if (createPath(outName, mode) == TRUE) {
+			/* make the final component, just in case it was
+			 * omitted by createPath() (which will skip the
+			 * directory if it doesn't have a terminating '/')
+			 */
+			mkdir(outName, mode);
+
 			/* Set the file time */
 			utb.actime = mtime;
 			utb.modtime = mtime;