X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=utility.c;h=cbbc02f989fb7ae7c9ce4be0a0d8b7cbda037b2a;hb=f1f6d58598ae6628b6a31d512e9148674349ee98;hp=e1e0f71a5ffa4f096c8d21741862664411f7b097;hpb=f86aee74ce995369a15bfa845d60376a8fc15279;p=oweals%2Fbusybox.git diff --git a/utility.c b/utility.c index e1e0f71a5..cbbc02f98 100644 --- a/utility.c +++ b/utility.c @@ -45,15 +45,15 @@ #include #include #include -#include #include #include +#include +#include #include /* for uname(2) */ #if defined BB_FEATURE_MOUNT_LOOP #include -#include -#include +#include /* 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 -#include _syscall1(int, sysinfo, struct sysinfo *, info); #endif /* BB_INIT */ +#if defined BB_MOUNT || defined BB_UMOUNT +#include + +#ifndef __NR_umount2 +#define __NR_umount2 52 +#endif + +/* Include our own version of , 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 -#include +/* From */ +#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 +#include /* 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: