From d97304aef21a7f3ac5a6699e3549e30507c760a3 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Mon, 24 Sep 2007 01:36:07 +0200 Subject: [PATCH] add libbb functions --- include/libbb.h | 9 +++++ lib/Makefile | 1 + lib/libbb.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 include/libbb.h create mode 100644 lib/libbb.c diff --git a/include/libbb.h b/include/libbb.h new file mode 100644 index 000000000..9455564d8 --- /dev/null +++ b/include/libbb.h @@ -0,0 +1,9 @@ + +#ifndef __LIBBB_H +#define __LIBBB_H +char *concat_path_file(const char *path, const char *filename); +int execable_file(const char *name); +char *find_execable(const char *filename); +char* last_char_is(const char *s, int c); + +#endif /* __LIBBB_H */ diff --git a/lib/Makefile b/lib/Makefile index 04c62b17b..32dafafe9 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -11,6 +11,7 @@ obj-y += xfuncs.o obj-y += getopt.o obj-y += readkey.o obj-y += kfifo.o +obj-y += libbb.o obj-$(CONFIG_BZLIB) += bzlib.o bzlib_crctable.o bzlib_decompress.o bzlib_huffman.o bzlib_randtable.o obj-$(CONFIG_ZLIB) += zlib.o gunzip.o obj-$(CONFIG_CRC32) += crc32.o diff --git a/lib/libbb.c b/lib/libbb.c new file mode 100644 index 000000000..d2cefd665 --- /dev/null +++ b/lib/libbb.c @@ -0,0 +1,87 @@ +/* vi: set sw=8 ts=8: */ +/* + * Utility routines. + * + * Copyright (C) many different people. + * If you wrote this, please acknowledge your work. + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include +#include +#include +#include +#include +#include +#include + +/* concatenate path and file name to new allocation buffer, + * not adding '/' if path name already has '/' +*/ +char *concat_path_file(const char *path, const char *filename) +{ + char *lc, *str; + + if (!path) + path = ""; + lc = last_char_is(path, '/'); + while (*filename == '/') + filename++; + + str = xmalloc(strlen(path) + (lc==0 ? 1 : 0) + strlen(filename) + 1); + sprintf(str, "%s%s%s", path, (lc==NULL ? "/" : ""), filename); + + return str; +} + +/* check if path points to an executable file; + * return 1 if found; + * return 0 otherwise; + */ +int execable_file(const char *name) +{ + struct stat s; + return (!stat(name, &s) && S_ISREG(s.st_mode)); +} + +/* search $PATH for an executable file; + * return allocated string containing full path if found; + * return NULL otherwise; + */ +char *find_execable(const char *filename) +{ + char *path, *p, *n; + + p = path = strdup(getenv("PATH")); + while (p) { + n = strchr(p, ':'); + if (n) + *n++ = '\0'; + if (*p != '\0') { /* it's not a PATH="foo::bar" situation */ + p = concat_path_file(p, filename); + if (execable_file(p)) { + free(path); + return p; + } + free(p); + } + p = n; + } + free(path); + return NULL; +} + +/* Find out if the last character of a string matches the one given. + * Don't underrun the buffer if the string length is 0. + */ +char* last_char_is(const char *s, int c) +{ + if (s && *s) { + size_t sz = strlen(s) - 1; + s += sz; + if ( (unsigned char)*s == c) + return (char*)s; + } + return NULL; +}