* [PATCH 0/2] Add and use file_exists() helper
@ 2026-10-30 7:16 Sascha Hauer
2026-10-30 7:16 ` [PATCH 1/2] libfile: add " Sascha Hauer
2026-10-30 7:16 ` [PATCH 2/2] treewise: use file_exists() Sascha Hauer
0 siblings, 2 replies; 3+ messages in thread
From: Sascha Hauer @ 2026-10-30 7:16 UTC (permalink / raw)
To: BAREBOX
Many places use stat() only to test for existence of a file without being
interested in the struct stat returned. Add a convenience helper for that
and convert users throughout the tree.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
Sascha Hauer (2):
libfile: add file_exists() helper
treewise: use file_exists()
arch/arm/boards/raspberry-pi/rpi-common.c | 7 ++-----
arch/arm/mach-k3/r5.c | 4 +---
commands/bfetch.c | 6 +++---
commands/cp.c | 7 ++-----
commands/edit.c | 3 +--
commands/fiptool.c | 7 -------
commands/readlink.c | 4 ++--
common/bbu.c | 3 +--
common/blspec.c | 4 +---
common/boot.c | 3 +--
common/complete.c | 5 ++---
common/environment.c | 5 +----
common/file-list.c | 4 ++--
common/firmware.c | 8 +++-----
common/menutree.c | 3 +--
common/startup.c | 21 +++++++-------------
drivers/usb/gadget/function/dfu.c | 4 +---
include/libfile.h | 13 ++++++++++++
lib/glob.c | 5 ++---
lib/libbb.c | 4 ++--
lib/libfile.c | 33 +++++++++++++++++++++++++++----
net/ifup.c | 13 ++++--------
22 files changed, 81 insertions(+), 85 deletions(-)
---
base-commit: df53c88dfd4ad18837d25b5b07555fa65873cba8
change-id: 20261030-file-exists-4e26fdf6ff96
Best regards,
--
Sascha Hauer <s.hauer@pengutronix.de>
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 1/2] libfile: add file_exists() helper
2026-10-30 7:16 [PATCH 0/2] Add and use file_exists() helper Sascha Hauer
@ 2026-10-30 7:16 ` Sascha Hauer
2026-10-30 7:16 ` [PATCH 2/2] treewise: use file_exists() Sascha Hauer
1 sibling, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2026-10-30 7:16 UTC (permalink / raw)
To: BAREBOX
Checking whether a file exists, possibly of a given type, takes a
struct stat and a call to stat() that are otherwise unused. Many places
do that, some with helpers of their own.
Add a generic file_exists_type() helper that checks for a file of a
given type, and file_exists() on top of it, which checks for a file of
any type. Use file_exists() in place of the helpers of the same name in
the fiptool command and the firmware loader, which would otherwise
conflict with it.
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
commands/fiptool.c | 7 -------
common/firmware.c | 8 +++-----
include/libfile.h | 13 +++++++++++++
lib/libfile.c | 28 ++++++++++++++++++++++++++++
4 files changed, 44 insertions(+), 12 deletions(-)
diff --git a/commands/fiptool.c b/commands/fiptool.c
index a0e67ed439..d83362b96a 100644
--- a/commands/fiptool.c
+++ b/commands/fiptool.c
@@ -174,13 +174,6 @@ static void parse_blob_opt(char *arg, uuid_t *uuid, char *filename, size_t len)
}
}
-static inline bool file_exists(const char *filename)
-{
- struct stat st;
-
- return stat(filename, &st) == 0;
-}
-
static __maybe_unused int create_cmd(struct fip_state *fip, int argc, char *argv[])
{
unsigned long long toc_flags = 0;
diff --git a/common/firmware.c b/common/firmware.c
index 3df1606ecd..c72fcbe556 100644
--- a/common/firmware.c
+++ b/common/firmware.c
@@ -236,11 +236,9 @@ void firmware_set_searchpath(const char *path)
firmware_path = strdup(path);
}
-static bool file_exists(const char *filename)
+static bool firmware_exists(const char *filename)
{
- struct stat s;
-
- return !stat(filename, &s);
+ return file_exists(filename);
}
/*
@@ -266,7 +264,7 @@ int firmwaremgr_load_file(struct firmware_mgr *mgr, const char *firmware)
dst = basprintf("/dev/%s", mgr->handler->id);
if (*firmware != '/') {
- fw = find_path(firmware_path, firmware, file_exists);
+ fw = find_path(firmware_path, firmware, firmware_exists);
if (fw)
firmware = fw;
}
diff --git a/include/libfile.h b/include/libfile.h
index 3f5ea5255a..72c736d301 100644
--- a/include/libfile.h
+++ b/include/libfile.h
@@ -37,6 +37,19 @@ int copy_recursive(const char *src, const char *dst, unsigned flags);
int compare_file(const char *f1, const char *f2);
+bool file_exists_type(const char *path, umode_t type);
+
+/**
+ * file_exists - check whether a file of any type exists
+ * @path: path of the file to check
+ *
+ * Return: true if @path exists, false otherwise
+ */
+static inline bool file_exists(const char *path)
+{
+ return file_exists_type(path, 0);
+}
+
#if IN_PROPER
int open_and_lseek(const char *filename, int mode, loff_t pos);
#else
diff --git a/lib/libfile.c b/lib/libfile.c
index 35ec631de8..2330d52d8e 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -745,6 +745,34 @@ int open_and_lseek(const char *filename, int mode, loff_t pos)
return ret;
}
+/**
+ * file_exists_type - check whether a file of a given type exists
+ * @path: path of the file to check
+ * @type: file type the file must have, one of the S_IF* values like
+ * S_IFREG or S_IFDIR, or 0 for any type
+ *
+ * Symbolic links are followed, unless @type is S_IFLNK, which checks
+ * for the link itself.
+ *
+ * Return: true if @path exists and is of type @type, false otherwise
+ */
+bool file_exists_type(const char *path, umode_t type)
+{
+ struct stat s;
+ int ret;
+
+ if (type == S_IFLNK)
+ ret = lstat(path, &s);
+ else
+ ret = stat(path, &s);
+
+ if (ret)
+ return false;
+
+ return !type || (s.st_mode & S_IFMT) == type;
+}
+EXPORT_SYMBOL(file_exists_type);
+
/**
* make_temp - create a name for a temporary file
* @template: The filename prefix
--
2.47.3
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH 2/2] treewise: use file_exists()
2026-10-30 7:16 [PATCH 0/2] Add and use file_exists() helper Sascha Hauer
2026-10-30 7:16 ` [PATCH 1/2] libfile: add " Sascha Hauer
@ 2026-10-30 7:16 ` Sascha Hauer
1 sibling, 0 replies; 3+ messages in thread
From: Sascha Hauer @ 2026-10-30 7:16 UTC (permalink / raw)
To: BAREBOX
Use file_exists() and file_exists_type() instead of calling stat() just
to check whether a file exists or is of a given type.
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
arch/arm/boards/raspberry-pi/rpi-common.c | 7 ++-----
arch/arm/mach-k3/r5.c | 4 +---
commands/bfetch.c | 6 +++---
commands/cp.c | 7 ++-----
commands/edit.c | 3 +--
commands/readlink.c | 4 ++--
common/bbu.c | 3 +--
common/blspec.c | 4 +---
common/boot.c | 3 +--
common/complete.c | 5 ++---
common/environment.c | 5 +----
common/file-list.c | 4 ++--
| 3 +--
common/startup.c | 21 +++++++--------------
drivers/usb/gadget/function/dfu.c | 4 +---
lib/glob.c | 5 ++---
lib/libbb.c | 4 ++--
lib/libfile.c | 5 +----
net/ifup.c | 13 ++++---------
19 files changed, 37 insertions(+), 73 deletions(-)
diff --git a/arch/arm/boards/raspberry-pi/rpi-common.c b/arch/arm/boards/raspberry-pi/rpi-common.c
index 9898e03111..442520993d 100644
--- a/arch/arm/boards/raspberry-pi/rpi-common.c
+++ b/arch/arm/boards/raspberry-pi/rpi-common.c
@@ -195,7 +195,6 @@ mem_initcall(rpi_mem_init);
static int rpi_env_init(void)
{
- struct stat s;
const char *diskdev;
int ret;
@@ -205,13 +204,11 @@ static int rpi_env_init(void)
device_detect_by_name("mci1");
diskdev = "/dev/disk0.0";
- ret = stat(diskdev, &s);
- if (ret) {
+ if (!file_exists(diskdev)) {
device_detect_by_name("mmc0");
diskdev = "/dev/mmc0.0";
- ret = stat(diskdev, &s);
}
- if (ret) {
+ if (!file_exists(diskdev)) {
printf("no /dev/disk0.0 or /dev/mmc0.0. using default env\n");
return 0;
}
diff --git a/arch/arm/mach-k3/r5.c b/arch/arm/mach-k3/r5.c
index 65f7f152d0..8816cbb409 100644
--- a/arch/arm/mach-k3/r5.c
+++ b/arch/arm/mach-k3/r5.c
@@ -364,7 +364,6 @@ static int do_dfu(void)
{
struct usbgadget_funcs funcs = {};
int ret;
- struct stat s;
funcs.flags |= USBGADGET_DFU;
funcs.dfu_opts = "/fip.img(fip)cs";
@@ -376,8 +375,7 @@ static int do_dfu(void)
}
while (1) {
- ret = stat("/fip.img", &s);
- if (!ret) {
+ if (file_exists("/fip.img")) {
printf("Downloaded FIP image, DFU done\n");
ret = load_fip("/fip.img", 0);
if (!ret)
diff --git a/commands/bfetch.c b/commands/bfetch.c
index 3083ae9933..5e5a6fe94e 100644
--- a/commands/bfetch.c
+++ b/commands/bfetch.c
@@ -14,6 +14,7 @@
#include <firmware.h>
#include <getopt.h>
#include <globalvar.h>
+#include <libfile.h>
#include <machine_id.h>
#include <memory.h>
#include <net.h>
@@ -357,7 +358,6 @@ static void print_framebuffers(unsigned *line)
static void print_features(unsigned *line)
{
- struct stat st;
struct string_list sl;
bool features = false;
size_t tmp;
@@ -373,7 +373,7 @@ static void print_features(unsigned *line)
if (IS_ENABLED(CONFIG_FEATURE_CONTROLLER) &&
!list_empty(&of_feature_controllers))
string_list_add(&sl, "FEATCTL");
- if (!stat("/dev/fw_cfg", &st))
+ if (file_exists("/dev/fw_cfg"))
string_list_add(&sl, "FW_CFG");
if (firmwaremgr_find_by_node(NULL))
string_list_add(&sl, "FWMGR");
@@ -440,7 +440,7 @@ static void print_features(unsigned *line)
if (IS_ENABLED(CONFIG_ARM_MMU_PERMISSIONS))
string_list_add(&sl, "W^X");
- if (IS_ENABLED(CONFIG_FS_UBOOTVARFS) && !stat("/dev/ubootvar", &st))
+ if (IS_ENABLED(CONFIG_FS_UBOOTVARFS) && file_exists("/dev/ubootvar"))
string_list_add(&sl, "UBOOTVARFS");
/* TODO: detect semihosting */
diff --git a/commands/cp.c b/commands/cp.c
index dc38cbab88..c30efca054 100644
--- a/commands/cp.c
+++ b/commands/cp.c
@@ -21,7 +21,6 @@
static int do_cp(int argc, char *argv[])
{
int ret = 1;
- struct stat statbuf;
int last_is_dir = 0;
int i;
int opt;
@@ -47,10 +46,8 @@ static int do_cp(int argc, char *argv[])
if (argc < argc_min)
return COMMAND_ERROR_USAGE;
- if (!stat(argv[argc - 1], &statbuf)) {
- if (S_ISDIR(statbuf.st_mode))
- last_is_dir = 1;
- }
+ if (file_exists_type(argv[argc - 1], S_IFDIR))
+ last_is_dir = 1;
if (((recursive && argc - optind > 2) || (argc > argc_min)) && !last_is_dir) {
printf("cp: target `%s' is not a directory\n", argv[argc - 1]);
diff --git a/commands/edit.c b/commands/edit.c
index 4442543b9a..cf11aaa7fa 100644
--- a/commands/edit.c
+++ b/commands/edit.c
@@ -176,9 +176,8 @@ static int edit_read_file(const char *path)
struct line *lastline = NULL;
char *filebuffer;
char *linestr, *lineend;
- struct stat s;
- if (!stat(path, &s)) {
+ if (file_exists(path)) {
filebuffer = read_file(path, NULL);
if (!filebuffer) {
printf("could not read %s: %m\n", path);
diff --git a/commands/readlink.c b/commands/readlink.c
index 021fbaa3e0..35f2b7a593 100644
--- a/commands/readlink.c
+++ b/commands/readlink.c
@@ -10,6 +10,7 @@
#include <fs.h>
#include <malloc.h>
#include <getopt.h>
+#include <libfile.h>
enum can_mode { CAN_NONE, CAN_ALL_BUT_LAST, CAN_EXISTING };
@@ -25,7 +26,6 @@ static void output_result(const char *var, const char *val)
static int canonicalize_filename_mode(const char *var, char *path, enum can_mode can_mode)
{
char *buf = NULL, *file, *dir;
- struct stat s;
int ret = -1;
buf = canonicalize_path(AT_FDCWD, path);
@@ -38,7 +38,7 @@ static int canonicalize_filename_mode(const char *var, char *path, enum can_mode
dir = dirname(path);
buf = canonicalize_path(AT_FDCWD, dir);
- if (!buf || stat(dir, &s) || !S_ISDIR(s.st_mode))
+ if (!buf || !file_exists_type(dir, S_IFDIR))
goto err;
buf = xrasprintf(buf, "/%s", file);
diff --git a/common/bbu.c b/common/bbu.c
index 4b1cf2ee88..70d49e3563 100644
--- a/common/bbu.c
+++ b/common/bbu.c
@@ -44,13 +44,12 @@ void bbu_append_handlers_to_file_list(struct file_list *files)
list_for_each_entry(handler, &bbu_image_handlers, list) {
const char *devicefile;
- struct stat s;
devicefile = handler->devicefile;
device_detect_by_name(devpath_to_name(devicefile));
- if (stat(devicefile, &s) == 0) {
+ if (file_exists(devicefile)) {
append_bbu_entry(handler->name, devicefile, files);
} else {
pr_info("Skipping handler bbu-%s: %s unavailable\n",
diff --git a/common/blspec.c b/common/blspec.c
index 0552e93b79..130c806e48 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -561,10 +561,8 @@ static int blspec_scan_directory(struct bootscanner *bootscanner,
for (i = 0; i < globb.gl_pathc; i++) {
const char *configname = globb.gl_pathv[i];
- struct stat s;
- ret = stat(configname, &s);
- if (ret || !S_ISREG(s.st_mode))
+ if (!file_exists_type(configname, S_IFREG))
continue;
ret = __blspec_scan_file(bootentries, root, configname);
diff --git a/common/boot.c b/common/boot.c
index 149bfeca00..5c74b1dd5d 100644
--- a/common/boot.c
+++ b/common/boot.c
@@ -348,7 +348,6 @@ static int bootscript_scan_name(struct bootentries *bootentries, const char *nam
{
const char *args = NULL;
char *path, *at;
- struct stat s;
int ret;
if (*name != '/')
@@ -357,7 +356,7 @@ static int bootscript_scan_name(struct bootentries *bootentries, const char *nam
path = xstrdup(name);
at = strchr(path, '@');
- if (at && !stat(path, &s))
+ if (at && file_exists(path))
at = NULL;
if (at) {
diff --git a/common/complete.c b/common/complete.c
index a01ce9b471..b778d9cecd 100644
--- a/common/complete.c
+++ b/common/complete.c
@@ -14,6 +14,7 @@
#include <libgen.h>
#include <command.h>
#include <environment.h>
+#include <libfile.h>
#define DEVPARAM_COMPLETE_ASSIGNMENT BIT(0)
#define DEVPARAM_COMPLETE_DOLLAR BIT(1)
@@ -86,7 +87,6 @@ static int file_complete(struct string_list *sl, char *instr,
static int path_command_complete(struct string_list *sl, char *instr)
{
- struct stat s;
DIR *dir;
struct dirent *d;
char tmp[PATH_MAX];
@@ -121,8 +121,7 @@ static int path_command_complete(struct string_list *sl, char *instr)
if (strstarts_escaped(d->d_name, instr)) {
strcpy(tmp, d->d_name);
- if (!stat(tmp, &s) &&
- S_ISDIR(s.st_mode))
+ if (file_exists_type(tmp, S_IFDIR))
continue;
else
strcat(tmp, " ");
diff --git a/common/environment.c b/common/environment.c
index faf9fc274e..4180aa90be 100644
--- a/common/environment.c
+++ b/common/environment.c
@@ -252,16 +252,13 @@ static int file_remove_action(const char *filename, struct stat *statbuf,
{
struct action_data *data = userdata;
char *envname;
- struct stat s;
- int ret;
struct envfs_entry *env;
filename += sizeof(TMPDIR) - 1;
envname = basprintf("%s/%s", data->base, filename);
- ret = stat(envname, &s);
- if (ret) {
+ if (!file_exists(envname)) {
char *base;
base = basename(envname);
diff --git a/common/file-list.c b/common/file-list.c
index 6298f8f82d..2b533657c2 100644
--- a/common/file-list.c
+++ b/common/file-list.c
@@ -10,6 +10,7 @@
#include <linux/err.h>
#include <driver.h>
#include <block.h>
+#include <libfile.h>
#define PARSE_DEVICE 0
#define PARSE_NAME 1
@@ -283,11 +284,10 @@ char *file_list_to_str(const struct file_list *files)
int file_list_detect_all(const struct file_list *files)
{
struct file_list_entry *fentry;
- struct stat s;
int i = 0;
list_for_each_entry(fentry, &files->list, list) {
- if (!stat(fentry->filename, &s))
+ if (file_exists(fentry->filename))
continue;
if (device_detect_by_name(devpath_to_name(fentry->filename)) == 0)
i++;
--git a/common/menutree.c b/common/menutree.c
index 6370ad1f56..2026a6e553 100644
--- a/common/menutree.c
+++ b/common/menutree.c
@@ -139,8 +139,7 @@ int menutree(const char *path, int toplevel)
mt->action = basprintf("%s/action", g.gl_pathv[i]);
- ret = stat(mt->action, &s);
- if (ret) {
+ if (!file_exists(mt->action)) {
mt->me.action = menutree_action_subdir;
free(mt->action);
mt->action = xstrdup(g.gl_pathv[i]);
diff --git a/common/startup.c b/common/startup.c
index 98da24873e..12a538715d 100644
--- a/common/startup.c
+++ b/common/startup.c
@@ -100,7 +100,6 @@ static void env_merge_of_compat_overlays(const char *dir)
{
struct device_node *root;
const char *compat;
- struct stat s;
char *ofdir, *src;
int count;
@@ -110,7 +109,7 @@ static void env_merge_of_compat_overlays(const char *dir)
ofdir = xasprintf("%s/match.of_compatible", dir);
- if (stat(ofdir, &s) || !S_ISDIR(s.st_mode))
+ if (!file_exists_type(ofdir, S_IFDIR))
goto out;
count = of_property_count_strings(root, "compatible");
@@ -126,7 +125,7 @@ static void env_merge_of_compat_overlays(const char *dir)
src = xasprintf("%s/%s", ofdir, compat);
- if (stat(src, &s) == 0 && S_ISDIR(s.st_mode)) {
+ if (file_exists_type(src, S_IFDIR)) {
pr_debug("Applying '%s'-compatible environment overlay\n",
compat);
copy_recursive(src, dir, 0);
@@ -239,7 +238,6 @@ enum autoboot_state do_autoboot_countdown(void)
static enum autoboot_state autoboot_state = AUTOBOOT_UNKNOWN;
unsigned flags = CONSOLE_COUNTDOWN_EXTERN;
int ret;
- struct stat s;
bool menu_exists;
char abortkeys[3] = {};
unsigned char outkey;
@@ -257,7 +255,7 @@ enum autoboot_state do_autoboot_countdown(void)
if (global_autoboot_state != AUTOBOOT_COUNTDOWN)
return global_autoboot_state;
- menu_exists = stat(MENUFILE, &s) == 0;
+ menu_exists = file_exists(MENUFILE);
if (menu_exists)
strcat(abortkeys, "m");
@@ -338,7 +336,6 @@ static int run_init(void)
{
const char *bmode, *cmdline;
bool env_bin_init_exists;
- struct stat s;
glob_t g;
int i, ret;
size_t size;
@@ -348,7 +345,7 @@ static int run_init(void)
export("PATH");
/* Run legacy /env/bin/init if it exists */
- env_bin_init_exists = stat(INITFILE, &s) == 0;
+ env_bin_init_exists = file_exists(INITFILE);
if (env_bin_init_exists) {
pr_info("running legacy %s...\n", INITFILE);
run_command("source " INITFILE);
@@ -369,11 +366,7 @@ static int run_init(void)
for (i = 0; i < g.gl_pathc; i++) {
const char *path = g.gl_pathv[i];
- ret = stat(path, &s);
- if (ret)
- continue;
-
- if (!S_ISREG(s.st_mode))
+ if (!file_exists_type(path, S_IFREG))
continue;
pr_debug("Executing '%s'...\n", path);
@@ -404,7 +397,7 @@ static int run_init(void)
scr = xasprintf("source /env/bmode/%s", bmode);
path = &scr[strlen("source ")];
- if (stat(path, &s) == 0) {
+ if (file_exists(path)) {
pr_info("Invoking '%s'...\n", path);
run_command("%s", scr);
}
@@ -436,7 +429,7 @@ static int run_init(void)
* message is printed if the file doesn't exist
*/
run_command(MENUFILE);
- } while (stat(MENUFILE, &s) == 0);
+ } while (file_exists(MENUFILE));
hang();
}
diff --git a/drivers/usb/gadget/function/dfu.c b/drivers/usb/gadget/function/dfu.c
index 90363586ee..9c145a7f8f 100644
--- a/drivers/usb/gadget/function/dfu.c
+++ b/drivers/usb/gadget/function/dfu.c
@@ -298,8 +298,6 @@ static void dfu_do_open_upload(struct dfu_work *dw)
static void dfu_do_close(struct dfu_work *dw)
{
- struct stat s;
-
pr_debug("do close\n");
if (dfufd > 0) {
@@ -307,7 +305,7 @@ static void dfu_do_close(struct dfu_work *dw)
dfufd = -EINVAL;
}
- if (!stat(DFU_TEMPFILE, &s))
+ if (file_exists(DFU_TEMPFILE))
unlink(DFU_TEMPFILE);
dw->dfu->dfu_state = DFU_STATE_dfuIDLE;
diff --git a/lib/glob.c b/lib/glob.c
index a077f2702b..0ffad8079d 100644
--- a/lib/glob.c
+++ b/lib/glob.c
@@ -10,6 +10,7 @@
#include <fnmatch.h>
#include <qsort.h>
#include <glob.h>
+#include <libfile.h>
static int glob_in_dir (const char *pattern, const char *directory,
int flags,
@@ -219,10 +220,8 @@ int glob(const char *pattern, int flags,
/* Append slashes to directory names. glob_in_dir has already
allocated the extra character for us. */
int i;
- struct stat st;
for (i = oldcount; i < pglob->gl_pathc; ++i)
- if (stat(pglob->gl_pathv[i], &st) == 0 &&
- S_ISDIR(st.st_mode))
+ if (file_exists_type(pglob->gl_pathv[i], S_IFDIR))
strcat(pglob->gl_pathv[i], "/");
}
#ifdef CONFIG_GLOB_SORT
diff --git a/lib/libbb.c b/lib/libbb.c
index 642e54d78f..1aff728b6f 100644
--- a/lib/libbb.c
+++ b/lib/libbb.c
@@ -14,6 +14,7 @@
#include <xfuncs.h>
#include <malloc.h>
#include <environment.h>
+#include <libfile.h>
/* concatenate path and file name to new allocation buffer,
* not adding '/' if path name already has '/'
@@ -91,8 +92,7 @@ EXPORT_SYMBOL(find_path);
*/
bool execable_file(const char *name)
{
- struct stat s;
- return (!stat(name, &s) && S_ISREG(s.st_mode));
+ return file_exists_type(name, S_IFREG);
}
EXPORT_SYMBOL(execable_file);
diff --git a/lib/libfile.c b/lib/libfile.c
index 2330d52d8e..0af8585c40 100644
--- a/lib/libfile.c
+++ b/lib/libfile.c
@@ -787,14 +787,11 @@ EXPORT_SYMBOL(file_exists_type);
char *make_temp(const char *template)
{
char *name = NULL;
- struct stat s;
- int ret;
do {
free(name);
name = basprintf("/tmp/%s-%08x", template, random32());
- ret = stat(name, &s);
- } while (!ret);
+ } while (file_exists(name));
return name;
}
diff --git a/net/ifup.c b/net/ifup.c
index cffdfe7c9b..a47eb4d543 100644
--- a/net/ifup.c
+++ b/net/ifup.c
@@ -18,18 +18,15 @@
#include <driver.h>
#include <init.h>
#include <magicvar.h>
+#include <libfile.h>
#include <linux/stat.h>
static int eth_discover(char *file)
{
- struct stat s;
- int ret;
+ int ret = 0;
- ret = stat(file, &s);
- if (ret) {
- ret = 0;
+ if (!file_exists(file))
goto out;
- }
ret = run_command("%s", file);
if (ret) {
@@ -69,11 +66,9 @@ static int source_env_network(struct eth_device *edev)
char *file;
const char *ethaddrstr, *modestr, *linuxdevname;
int ret, mode, ethaddr_valid = 0, i;
- struct stat s;
file = basprintf("/env/network/%s", edev->devname);
- ret = stat(file, &s);
- if (ret) {
+ if (!file_exists(file)) {
free(file);
return 0;
}
--
2.47.3
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-30 8:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-30 7:16 [PATCH 0/2] Add and use file_exists() helper Sascha Hauer
2026-10-30 7:16 ` [PATCH 1/2] libfile: add " Sascha Hauer
2026-10-30 7:16 ` [PATCH 2/2] treewise: use file_exists() Sascha Hauer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox