#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
# endif
#endif
-
extern void usage(const char *usage)
{
fprintf(stderr, "BusyBox v%s (%s) multi-call binary -- GPL2\n\n",
#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)
#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)
{
#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
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)
{
}
#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;
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')
}
#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: