diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-03-27 01:21:46 -0800 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 21:35:12 -0700 |
commit | 4a539daf1e5daa17b52239478d97f8dc7a6506b6 (patch) | |
tree | 0c0554e55bba3ec47ca9844da0135ee8c68c3622 /namedev_parse.c | |
parent | 949e32f2249da55890a6a49208023df30b6b5227 (diff) |
[PATCH] dev_d.c file sorting and cleanup
On Thu, Mar 25, 2004 at 02:52:13AM +0100, Kay Sievers wrote:
> Please have look if it still works for you, I only did a very quick
> test.
Here is a unified version, with all the functions moved to udev_lib.c.
We have a generic function now, to call a given fnct(char *) for every
file ending with a specific suffix, sorted in lexical order. We use it
to execute the dev.d/ files and read our rules.d/ files. The binary
should be a bit smaller now.
I've also changed it, to not do the dev.d/ exec for net devices.
Diffstat (limited to 'namedev_parse.c')
-rw-r--r-- | namedev_parse.c | 93 |
1 files changed, 14 insertions, 79 deletions
diff --git a/namedev_parse.c b/namedev_parse.c index f4ffdb21d6..679efae1b5 100644 --- a/namedev_parse.c +++ b/namedev_parse.c @@ -33,7 +33,6 @@ #include <ctype.h> #include <unistd.h> #include <sys/stat.h> -#include <dirent.h> #include <errno.h> #include "udev.h" @@ -41,8 +40,6 @@ #include "logging.h" #include "namedev.h" -LIST_HEAD(file_list); - static int add_config_dev(struct config_device *new_dev) { @@ -416,88 +413,26 @@ exit: return retval; } -struct files { - struct list_head list; - char name[NAME_SIZE]; -}; - -/* sort files in lexical order */ -static int file_list_insert(char *filename) -{ - struct files *loop_file; - struct files *new_file; - - list_for_each_entry(loop_file, &file_list, list) { - if (strcmp(loop_file->name, filename) > 0) { - break; - } - } - - new_file = malloc(sizeof(struct files)); - if (new_file == NULL) { - dbg("error malloc"); - return -ENOMEM; - } - - strfieldcpy(new_file->name, filename); - list_add_tail(&new_file->list, &loop_file->list); - return 0; -} - -/* calls function for file or every file found in directory */ -static int call_foreach_file(int parser (char *f) , char *filename, char *extension) +int namedev_init_rules() { - struct dirent *ent; - DIR *dir; - char *ext; - char file[NAME_SIZE]; struct stat stats; - struct files *loop_file; - struct files *tmp_file; - /* look if we have a plain file or a directory to scan */ - stat(filename, &stats); + stat(udev_rules_filename, &stats); if ((stats.st_mode & S_IFMT) != S_IFDIR) - return parser(filename); - - /* sort matching filename into list */ - dbg("open config as directory '%s'", filename); - dir = opendir(filename); - while (1) { - ent = readdir(dir); - if (ent == NULL || ent->d_name[0] == '\0') - break; - - dbg("found file '%s'", ent->d_name); - ext = strrchr(ent->d_name, '.'); - if (ext == NULL) - continue; - - if (strcmp(ext, extension) == 0) { - dbg("put file in list '%s'", ent->d_name); - file_list_insert(ent->d_name); - } - } - - /* parse every file in the list */ - list_for_each_entry_safe(loop_file, tmp_file, &file_list, list) { - strfieldcpy(file, filename); - strfieldcat(file, loop_file->name); - parser(file); - list_del(&loop_file->list); - free(loop_file); - } - - closedir(dir); - return 0; -} - -int namedev_init_rules() -{ - return call_foreach_file(namedev_parse_rules, udev_rules_filename, RULEFILE_EXT); + return namedev_parse_rules(udev_rules_filename); + else + return call_foreach_file(namedev_parse_rules, + udev_rules_filename, RULEFILE_SUFFIX); } int namedev_init_permissions() { - return call_foreach_file(namedev_parse_permissions, udev_permissions_filename, PERMFILE_EXT); + struct stat stats; + + stat(udev_permissions_filename, &stats); + if ((stats.st_mode & S_IFMT) != S_IFDIR) + return namedev_parse_permissions(udev_permissions_filename); + else + return call_foreach_file(namedev_parse_permissions, + udev_permissions_filename, PERMFILE_SUFFIX); } |