chiark / gitweb /
[PATCH] change call_foreach_file to return a list
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Thu, 17 Mar 2005 08:59:32 +0000 (09:59 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:53:53 +0000 (23:53 -0700)
udev_multiplex.c
udev_rules_parse.c
udev_utils.c
udev_utils.h

index 3ef6e1707ac6b599af1dce0552d33a329f5ff787..9ab11e6beaa2fa59c8c061446100e556260a2f64 100644 (file)
@@ -74,6 +74,8 @@ static int run_program(struct udevice *udev, const char *filename)
 void udev_multiplex_directory(struct udevice *udev, const char *basedir, const char *suffix)
 {
        char dirname[PATH_SIZE];
+       struct name_entry *name_loop, *name_tmp;
+       LIST_HEAD(name_list);
 
        /* chop the device name up into pieces based on '/' */
        if (udev->name[0] != '\0') {
@@ -89,7 +91,7 @@ void udev_multiplex_directory(struct udevice *udev, const char *basedir, const c
                        if (strcmp(devname, udev->subsystem) != 0) {
                                snprintf(dirname, sizeof(dirname), "%s/%s", basedir, devname);
                                dirname[sizeof(dirname)-1] = '\0';
-                               call_foreach_file(run_program, udev, dirname, suffix);
+                               add_matching_files(&name_list, dirname, suffix);
                        }
 
                        temp[0] = '/';
@@ -101,16 +103,22 @@ void udev_multiplex_directory(struct udevice *udev, const char *basedir, const c
        if (udev->name[0] != '\0') {
                snprintf(dirname, sizeof(dirname), "%s/%s", basedir, udev->name);
                dirname[sizeof(dirname)-1] = '\0';
-               call_foreach_file(run_program, udev, dirname, suffix);
+               add_matching_files(&name_list, dirname, suffix);
        }
 
        if (udev->subsystem[0] != '\0') {
                snprintf(dirname, sizeof(dirname), "%s/%s", basedir, udev->subsystem);
                dirname[sizeof(dirname)-1] = '\0';
-               call_foreach_file(run_program, udev, dirname, suffix);
+               add_matching_files(&name_list, dirname, suffix);
        }
 
        snprintf(dirname, sizeof(dirname), "%s/default", basedir);
        dirname[sizeof(dirname)-1] = '\0';
-       call_foreach_file(run_program, udev, dirname, suffix);
+       add_matching_files(&name_list, dirname, suffix);
+
+       list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) {
+               run_program(udev, name_loop->name);
+               list_del(&name_loop->node);
+       }
+
 }
index face496ab33b68880635fa099d417035e053a5a4..55412dba3c5a8e7e717236ffff1f0b8e321b300f 100644 (file)
@@ -168,7 +168,7 @@ static char *get_key_attribute(char *str)
        return NULL;
 }
 
-static int rules_parse(struct udevice *udev, const char *filename)
+static int rules_parse(const char *filename)
 {
        char line[LINE_SIZE];
        char *bufline;
@@ -446,9 +446,18 @@ int udev_rules_init(void)
                return -1;
 
        if ((stats.st_mode & S_IFMT) != S_IFDIR)
-               retval = rules_parse(NULL, udev_rules_filename);
-       else
-               retval = call_foreach_file(rules_parse, NULL, udev_rules_filename, RULEFILE_SUFFIX);
+               retval = rules_parse(udev_rules_filename);
+       else {
+               struct name_entry *name_loop, *name_tmp;
+               LIST_HEAD(name_list);
+
+               retval = add_matching_files(&name_list, udev_rules_filename, RULEFILE_SUFFIX);
+
+               list_for_each_entry_safe(name_loop, name_tmp, &name_list, node) {
+                       rules_parse(name_loop->name);
+                       list_del(&name_loop->node);
+               }
+       }
 
        return retval;
 }
index c6658e6933fbcc0a795d26c3dcbf71044aabf19a..2b5683fda65b5801207fb8a878cac167fe32a758 100644 (file)
@@ -265,15 +265,12 @@ int name_list_add(struct list_head *name_list, const char *name, int sort)
 }
 
 /* calls function for every file found in specified directory */
-int call_foreach_file(int (*handler_function)(struct udevice *udev, const char *string),
-                     struct udevice *udev, const char *dirname, const char *suffix)
+int add_matching_files(struct list_head *name_list, const char *dirname, const char *suffix)
 {
        struct dirent *ent;
        DIR *dir;
        char *ext;
-       struct name_entry *loop_file;
-       struct name_entry *tmp_file;
-       LIST_HEAD(file_list);
+       char filename[PATH_SIZE];
 
        dbg("open directory '%s'", dirname);
        dir = opendir(dirname);
@@ -290,7 +287,7 @@ int call_foreach_file(int (*handler_function)(struct udevice *udev, const char *
                if ((ent->d_name[0] == '.') || (ent->d_name[0] == COMMENT_CHARACTER))
                        continue;
 
-               /* look for file with specified suffix */
+               /* look for file matching with specified suffix */
                ext = strrchr(ent->d_name, '.');
                if (ext == NULL)
                        continue;
@@ -299,20 +296,10 @@ int call_foreach_file(int (*handler_function)(struct udevice *udev, const char *
                        continue;
 
                dbg("put file '%s/%s' in list", dirname, ent->d_name);
-               name_list_add(&file_list, ent->d_name, 1);
-       }
-
-       /* call function for every file in the list */
-       list_for_each_entry_safe(loop_file, tmp_file, &file_list, node) {
-               char filename[PATH_SIZE];
 
-               snprintf(filename, sizeof(filename), "%s/%s", dirname, loop_file->name);
+               snprintf(filename, sizeof(filename), "%s/%s", dirname, ent->d_name);
                filename[sizeof(filename)-1] = '\0';
-
-               handler_function(udev, filename);
-
-               list_del(&loop_file->node);
-               free(loop_file);
+               name_list_add(name_list, filename, 1);
        }
 
        closedir(dir);
index c7a41aaa449371b71e957b699b4d4d7b6e85bec5..b45500dcff61b63f6d6ff76572b9c672720b41f8 100644 (file)
@@ -41,6 +41,6 @@ extern void file_unmap(char *buf, size_t bufsize);
 extern size_t buf_get_line(const char *buf, size_t buflen, size_t cur);
 extern void no_trailing_slash(char *path);
 extern int name_list_add(struct list_head *name_list, const char *name, int sort);
-extern int call_foreach_file(int (*handler_function)(struct udevice *udev, const char *string),
-                            struct udevice *udev, const char *dirname, const char *suffix);
+extern int add_matching_files(struct list_head *name_list, const char *dirname, const char *suffix);
+
 #endif