summaryrefslogtreecommitdiffstats
path: root/lib/libbb.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2007-09-24 01:36:07 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2007-09-24 01:36:07 +0200
commitd97304aef21a7f3ac5a6699e3549e30507c760a3 (patch)
treedbc2225779b679585888348c0b7efdf799d7319d /lib/libbb.c
parent0aab14790470bd9dd52323d9144c17fbba4ef4ad (diff)
downloadbarebox-d97304aef21a7f3ac5a6699e3549e30507c760a3.tar.gz
barebox-d97304aef21a7f3ac5a6699e3549e30507c760a3.tar.xz
add libbb functions
Diffstat (limited to 'lib/libbb.c')
-rw-r--r--lib/libbb.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/lib/libbb.c b/lib/libbb.c
new file mode 100644
index 0000000000..d2cefd6653
--- /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 <common.h>
+#include <libbb.h>
+#include <linux/stat.h>
+#include <fs.h>
+#include <xfuncs.h>
+#include <malloc.h>
+#include <environment.h>
+
+/* 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;
+}