From: Sascha Hauer <s.hauer@pengutronix.de> To: Barebox List <barebox@lists.infradead.org> Subject: [PATCH 05/18] libbb: Add find_path function Date: Thu, 24 Jun 2021 10:52:10 +0200 [thread overview] Message-ID: <20210624085223.14616-6-s.hauer@pengutronix.de> (raw) In-Reply-To: <20210624085223.14616-1-s.hauer@pengutronix.de> libbb contains a find_execable() function to find an executable in a colon separated path. The code can be reused by making the environment variable name and the is-executable test parameters. Do this and add a find_path() Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> --- include/libbb.h | 4 +++- lib/libbb.c | 58 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/include/libbb.h b/include/libbb.h index a3a13b41ce..e191874052 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -8,8 +8,10 @@ char *concat_path_file(const char *path, const char *filename); char *concat_subpath_file(const char *path, const char *f); -int execable_file(const char *name); +bool execable_file(const char *name); char *find_execable(const char *filename); +char *find_path(const char *path, const char *filename, + bool (*filter)(const char *)); char* last_char_is(const char *s, int c); enum { diff --git a/lib/libbb.c b/lib/libbb.c index d0c9bf4d80..642e54d78f 100644 --- a/lib/libbb.c +++ b/lib/libbb.c @@ -49,11 +49,47 @@ char *concat_subpath_file(const char *path, const char *f) } EXPORT_SYMBOL(concat_subpath_file); +/** + * find_path - find a file in a colon separated path + * @path: The search path, colon separated + * @filename: The filename to search for + * @filter: filter function + * + * searches for @filename in a colon separated list of directories given in + * @path. @filter should return true when the current file matches the expectations, + * false otherwise. @filter should check for existence of the file, but could also + * check for additional flags. + */ +char *find_path(const char *path, const char *filename, + bool (*filter)(const char *)) +{ + char *p, *n, *freep; + + freep = p = strdup(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 (filter(p)) { + free(freep); + return p; + } + free(p); + } + p = n; + } + free(freep); + return NULL; +} +EXPORT_SYMBOL(find_path); + /* check if path points to an executable file; * return 1 if found; * return 0 otherwise; */ -int execable_file(const char *name) +bool execable_file(const char *name) { struct stat s; return (!stat(name, &s) && S_ISREG(s.st_mode)); @@ -67,25 +103,7 @@ EXPORT_SYMBOL(execable_file); */ 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; + return find_path(getenv("PATH"), filename, execable_file); } EXPORT_SYMBOL(find_execable); -- 2.29.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
next prev parent reply other threads:[~2021-06-24 8:54 UTC|newest] Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-06-24 8:52 [PATCH v3 00/18] Apply device tree overlays to kernel tree Sascha Hauer 2021-06-24 8:52 ` [PATCH 01/18] of: of_copy_node(): Copy phandles as well Sascha Hauer 2021-06-24 8:52 ` [PATCH 02/18] of: Add function to duplicate a device tree Sascha Hauer 2021-06-24 8:52 ` [PATCH 03/18] fdt: Check blob size during unflattening Sascha Hauer 2021-06-24 8:52 ` [PATCH 04/18] firmware: make device_node argument non const Sascha Hauer 2021-06-24 8:52 ` Sascha Hauer [this message] 2021-06-24 8:52 ` [PATCH 06/18] firmware: consolidate ifdefs Sascha Hauer 2021-06-24 8:52 ` [PATCH 07/18] firmware: Add search path Sascha Hauer 2021-06-24 8:52 ` [PATCH 08/18] firmware: Fix device_node matching Sascha Hauer 2021-06-24 8:52 ` [PATCH 09/18] firmware: recognize by reproducible name Sascha Hauer 2021-06-24 8:52 ` [PATCH 10/18] blspec: Set firmware searchpath Sascha Hauer 2021-06-24 8:52 ` [PATCH 11/18] overlay: Add of_overlay_apply_file() Sascha Hauer 2021-06-24 8:52 ` [PATCH 12/18] firmware: Load from global search path Sascha Hauer 2021-06-24 8:52 ` [PATCH 13/18] blspec: Rework firmware load Sascha Hauer 2021-06-24 8:52 ` [PATCH 14/18] overlay: Add filters to choose which overlays to apply Sascha Hauer 2021-06-28 18:58 ` Michael Riesch 2021-06-28 20:13 ` Sascha Hauer 2021-06-24 8:52 ` [PATCH 15/18] blspec: Apply overlays from rootfs Sascha Hauer 2021-06-24 8:52 ` [PATCH 16/18] doc: devicetree: Refer to internal device tree also as live tree Sascha Hauer 2021-06-24 8:52 ` [PATCH 17/18] Documentation: Add documentation for device tree overlays Sascha Hauer 2021-06-24 8:52 ` [PATCH 18/18] of_firmware: Fix handling of firmware-name property Sascha Hauer
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20210624085223.14616-6-s.hauer@pengutronix.de \ --to=s.hauer@pengutronix.de \ --cc=barebox@lists.infradead.org \ --subject='Re: [PATCH 05/18] libbb: Add find_path function' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox