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 <[email protected]>
---
 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 ++--
 common/menutree.c                         |  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++;
diff --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


Reply via email to