Some changelog updates.
[oweals/busybox.git] / utility.c
index e1e0f71a5ffa4f096c8d21741862664411f7b097..cbbc02f989fb7ae7c9ce4be0a0d8b7cbda037b2a 100644 (file)
--- a/utility.c
+++ b/utility.c
 #include <dirent.h>
 #include <time.h>
 #include <utime.h>
-#include <sys/stat.h>
 #include <unistd.h>
 #include <ctype.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
 #include <sys/utsname.h>               /* for uname(2) */
 
 #if defined BB_FEATURE_MOUNT_LOOP
 #include <fcntl.h>
-#include <sys/ioctl.h>
-#include <linux/loop.h>
+#include <linux/loop.h> /* Pull in loop device support */
 #endif
 
 /* Busybox mount uses either /proc/filesystems or /dev/mtab to get the 
@@ -80,7 +80,6 @@ const char mtab_file[] = "/dev/mtab";
 #  endif
 #endif
 
-
 extern void usage(const char *usage)
 {
        fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
@@ -135,10 +134,24 @@ extern int get_kernel_revision(void)
 
 #if defined BB_FREE || defined BB_INIT || defined BB_UNAME || defined BB_UPTIME
 #include <sys/syscall.h>
-#include <linux/unistd.h>
 _syscall1(int, sysinfo, struct sysinfo *, info);
 #endif                                                 /* BB_INIT */
 
+#if defined BB_MOUNT || defined BB_UMOUNT
+#include <sys/syscall.h>
+
+#ifndef __NR_umount2
+#define __NR_umount2           52
+#endif
+
+/* Include our own version of <sys/mount.h>, since libc5 doesn't
+ * know about umount2 */
+extern _syscall1(int, umount, const char *, special_file);
+extern _syscall2(int, umount2, const char *, special_file, int, flags);
+extern _syscall5(int, mount, const char *, special_file, const char *, dir,
+               const char *, fstype, unsigned long int, rwflag, const void *, data);
+#endif
+
 
 
 #if defined (BB_CP_MV) || defined (BB_DU)
@@ -904,9 +917,10 @@ unsigned long my_getpwnamegid(char *name)
 
 #if (defined BB_CHVT) || (defined BB_DEALLOCVT) || (defined BB_SETKEYCODES)
 
-
-#include <linux/kd.h>
-#include <sys/ioctl.h>
+/* From <linux/kd.h> */ 
+#define KDGKBTYPE       0x4B33  /* get keyboard type */
+#define         KB_84           0x01
+#define         KB_101          0x02    /* this is what we always answer */
 
 int is_a_console(int fd)
 {
@@ -1288,7 +1302,7 @@ extern int device_open(char *device, int mode)
 
 #if defined BB_KILLALL || ( defined BB_FEATURE_LINUXRC && ( defined BB_HALT || defined BB_REBOOT || defined BB_POWEROFF ))
 #ifdef BB_FEATURE_USE_DEVPS_PATCH
-#include <linux/devps.h>
+#include <linux/devps.h> /* For Erik's nifty devps device driver */
 #endif
 
 #if defined BB_FEATURE_USE_DEVPS_PATCH
@@ -1442,6 +1456,36 @@ extern void *xmalloc(size_t size)
        return cp;
 }
 
+#if defined BB_FEATURE_NFSMOUNT
+extern char * xstrdup (const char *s) {
+       char *t;
+
+       if (s == NULL)
+               return NULL;
+
+       t = strdup (s);
+
+       if (t == NULL)
+               fatalError(memory_exhausted, "");
+
+       return t;
+}
+
+extern char * xstrndup (const char *s, int n) {
+       char *t;
+
+       if (s == NULL)
+               fatalError("xstrndup bug");
+
+       t = xmalloc(n+1);
+       strncpy(t,s,n);
+       t[n] = 0;
+
+       return t;
+}
+#endif
+
+
 #if (__GLIBC__ < 2) && (defined BB_SYSLOGD || defined BB_INIT)
 extern int vdprintf(int d, const char *format, va_list ap)
 {
@@ -1583,13 +1627,14 @@ extern int find_real_root_device_name(char* name)
 }
 #endif
 
-static const int GROWBY = 80; /* how large we will grow strings by */
 
 /* get_line_from_file() - This function reads an entire line from a text file
  * up to a newline. It returns a malloc'ed char * which must be stored and
  * free'ed  by the caller. */
 extern char *get_line_from_file(FILE *file)
 {
+       static const int GROWBY = 80; /* how large we will grow strings by */
+
        int ch;
        int idx = 0;
        char *linebuf = NULL;
@@ -1600,7 +1645,7 @@ extern char *get_line_from_file(FILE *file)
                if (ch == EOF)
                        break;
                /* grow the line buffer as necessary */
-               if (idx > linebufsz-1)
+               if (idx > linebufsz-2)
                        linebuf = realloc(linebuf, linebufsz += GROWBY);
                linebuf[idx++] = (char)ch;
                if ((char)ch == '\n')
@@ -1659,6 +1704,39 @@ char process_escape_sequence(char **ptr)
 }
 #endif
 
+#if defined BB_BASENAME || defined BB_LN
+char *get_last_path_component(char *path)
+{
+       char *s=path+strlen(path)-1;
+
+       /* strip trailing slashes */
+       while (s && *s == '/') {
+               *s-- = '\0';
+       }
+
+       /* find last component */
+       s = strrchr(path, '/');
+       if (s==NULL) return path;
+       else return s+1;
+}
+#endif
+
+#if defined BB_GREP || defined BB_SED
+int bb_regcomp(regex_t *preg, const char *regex, int cflags)
+{
+       int ret;
+       if ((ret = regcomp(preg, regex, cflags)) != 0) {
+               int errmsgsz = regerror(ret, preg, NULL, 0);
+               char *errmsg = xmalloc(errmsgsz);
+               regerror(ret, preg, errmsg, errmsgsz);
+               errorMsg("bb_regcomp: %s\n", errmsg);
+               free(errmsg);
+               regfree(preg);
+       }
+       return ret;
+}
+#endif
+
 /* END CODE */
 /*
 Local Variables: