From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/busybox/libbb/execable.c | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 release/src/router/busybox/libbb/execable.c (limited to 'release/src/router/busybox/libbb/execable.c') diff --git a/release/src/router/busybox/libbb/execable.c b/release/src/router/busybox/libbb/execable.c new file mode 100644 index 00000000..5c7ac16a --- /dev/null +++ b/release/src/router/busybox/libbb/execable.c @@ -0,0 +1,78 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) 2006 Gabriel Somlo + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include "libbb.h" + +/* check if path points to an executable file; + * return 1 if found; + * return 0 otherwise; + */ +int FAST_FUNC execable_file(const char *name) +{ + struct stat s; + return (!access(name, X_OK) && !stat(name, &s) && S_ISREG(s.st_mode)); +} + +/* search (*PATHp) for an executable file; + * return allocated string containing full path if found; + * PATHp points to the component after the one where it was found + * (or NULL), + * you may call find_execable again with this PATHp to continue + * (if it's not NULL). + * return NULL otherwise; (PATHp is undefined) + * in all cases (*PATHp) contents will be trashed (s/:/NUL/). + */ +char* FAST_FUNC find_execable(const char *filename, char **PATHp) +{ + char *p, *n; + + p = *PATHp; + 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)) { + *PATHp = n; + return p; + } + free(p); + } + p = n; + } /* on loop exit p == NULL */ + return p; +} + +/* search $PATH for an executable file; + * return 1 if found; + * return 0 otherwise; + */ +int FAST_FUNC exists_execable(const char *filename) +{ + char *path = xstrdup(getenv("PATH")); + char *tmp = path; + char *ret = find_execable(filename, &tmp); + free(path); + if (ret) { + free(ret); + return 1; + } + return 0; +} + +#if ENABLE_FEATURE_PREFER_APPLETS +/* just like the real execvp, but try to launch an applet named 'file' first + */ +int FAST_FUNC bb_execvp(const char *file, char *const argv[]) +{ + return execvp(find_applet_by_name(file) >= 0 ? bb_busybox_exec_path : file, + argv); +} +#endif -- cgit v1.2.3-54-g00ecf