From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrey Borzenkov Date: Sun, 22 Feb 2004 09:45:21 +0000 Subject: [PATCH] support directory for rules and permissions Message-Id: <20040222094521.GC4873@localhost.localdomain> MIME-Version: 1 Content-Type: multipart/mixed; boundary="b5gNqxB1S1yM7hjW" List-Id: To: linux-hotplug@vger.kernel.org --b5gNqxB1S1yM7hjW Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Feb 16, 2004 at 02:34:33PM -0800, Greg KH wrote: > On Sat, Jan 17, 2004 at 11:13:00PM +0300, Andrey Borzenkov wrote: > > Attached patch adds support for > > > > - multiple rules files. You can now do > > > > udev_rules="file1 dir2 file3 ..." > > Care to fix this patch up for the latest udev release? > This is new version that I have been runing for some time. It does not directly support multiple files; rather you can give either file or directory; directory is scanned, sorted and all files are read in order. KLIBC case still supports single file only; I do not think anything more complicated will be needed for initrd. The only reason for first patch was to ensure config files order and it is not done automatically. regards -andrey --b5gNqxB1S1yM7hjW Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="udev018_config_dir.patch" --- udev-018/namedev.c.multi 2004-02-19 21:38:37.000000000 +0300 +++ udev-018/namedev.c 2004-02-21 21:57:19.350887008 +0300 @@ -807,12 +807,12 @@ int namedev_name_device(struct sysfs_cla if (match_rule(dev, class_dev, udev, sysfs_device) == 0) { if (dev->name[0] == '\0') { info("configured rule in '%s' at line %i applied, '%s' is ignored", - udev_rules_filename, dev->config_line, udev->kernel_name); + dev->config_file, dev->config_line, udev->kernel_name); return -1; } info("configured rule in '%s' at line %i applied, '%s' becomes '%s'", - udev_rules_filename, dev->config_line, udev->kernel_name, dev->name); + dev->config_file, dev->config_line, udev->kernel_name, dev->name); strfieldcpy(udev->name, dev->name); strfieldcpy(udev->symlink, dev->symlink); goto found; --- udev-018/namedev.h.multi 2004-02-19 21:38:35.000000000 +0300 +++ udev-018/namedev.h 2004-02-21 21:54:58.000000000 +0300 @@ -71,6 +71,7 @@ struct config_device { struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS]; int partitions; int config_line; + char *config_file; }; struct perm_device { --- udev-018/namedev_parse.c.multi 2004-02-19 21:38:35.000000000 +0300 +++ udev-018/namedev_parse.c 2004-02-21 21:47:48.000000000 +0300 @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include "udev.h" #include "logging.h" @@ -114,7 +116,7 @@ static char *get_key_attribute(char *str return NULL; } -int namedev_init_rules(void) +static int parse_rules_file(const char *file) { char line[255]; int lineno; @@ -126,15 +128,19 @@ int namedev_init_rules(void) int program_given = 0; int retval = 0; struct config_device dev; + char *p; - fd = fopen(udev_rules_filename, "r"); + fd = fopen(file, "r"); if (fd != NULL) { - dbg("reading '%s' as rules file", udev_rules_filename); + dbg("reading '%s' as rules file", file); } else { - dbg("can't open '%s' as a rules file", udev_rules_filename); + dbg("can't open '%s' as a rules file", file); return -ENODEV; } + /* Yes, this is memory leak. It won't be freed */ + p = strdup(file); + /* loop through the whole file */ lineno = 0; while (1) { @@ -256,13 +262,14 @@ int namedev_init_rules(void) } dev.config_line = lineno; + dev.config_file = p; retval = add_config_dev(&dev); if (retval) { dbg("add_config_dev returned with error %d", retval); continue; error: dbg("%s:%d:%d: parse error, rule skipped", - udev_rules_filename, lineno, temp - line); + file, lineno, temp - line); } } exit: @@ -270,7 +277,7 @@ exit: return retval; } -int namedev_init_permissions(void) +static int parse_permissions_file(const char *file) { char line[255]; char *temp; @@ -279,11 +286,11 @@ int namedev_init_permissions(void) int retval = 0; struct perm_device dev; - fd = fopen(udev_permissions_filename, "r"); + fd = fopen(file, "r"); if (fd != NULL) { - dbg("reading '%s' as permissions file", udev_permissions_filename); + dbg("reading '%s' as permissions file", file); } else { - dbg("can't open '%s' as permissions file", udev_permissions_filename); + dbg("can't open '%s' as permissions file", file); return -ENODEV; } @@ -350,5 +357,108 @@ int namedev_init_permissions(void) exit: fclose(fd); return retval; +} + +static int ends_with(const char *name, const char *suf) +{ + char *p = strstr(name, suf); + + if (!p) + return 0; + + if (p[strlen(suf)]) + return 0; + + return 1; } +/* + * skip + * all hidden files + * usual backup files from editor or RPM + * non-plain files + */ +static int filter(const struct dirent *dirent) +{ + char *name = dirent->d_name; + + if (name[0] == '.') + return 0; + + if (ends_with(name, ".rpmorig") || + ends_with(name, ".rpmsave") || + ends_with(name, ".rpmnew") || + ends_with(name, "~") || + ends_with(name, ".orig")) + return 0; + + return 1; +} + +static int parse_rules(char *file, int (*func)(const char *)) +{ + struct stat buf; + int err = 0; + + + if (stat(file, &buf) == -1) { + err = errno; + dbg("parse_rules: can't stat %s", file); + return errno; + } + + if (S_ISREG(buf.st_mode)) + return (*func)(file); + +#ifndef __KLIBC__ + if (S_ISDIR(buf.st_mode)) { + struct dirent **dirents = 0; + int nfiles, i; + + if ((nfiles = scandir(file, &dirents, filter, alphasort)) == -1) { + err = errno; + dbg("parse_rules: scandir '%s' error", file); + return err; + } + + for (i = 0; i < nfiles; i++) { + char temp[PATH_MAX + NAME_MAX]; + + snprintf(temp, sizeof(temp), "%s/%s", file, dirents[i]->d_name); + free(dirents[i]); + + if (stat(temp, &buf) == -1) { + dbg("parse_rules: cannot stat '%s'", temp); + continue; + } + + if (!S_ISREG(buf.st_mode)) { + dbg("parse_rules: not a regular file '%s'", temp); + continue; + } + + err = (*func)(temp); + if (err) + return err; + } + + free(dirents); + + return 0; + } +#endif + + dbg("parse_rules: '%s' has unknown file type %o", file, buf.st_mode); + return -EINVAL; + +} + +int namedev_init_rules(void) +{ + return parse_rules(udev_rules_filename, parse_rules_file); +} + +int namedev_init_permissions(void) +{ + return parse_rules(udev_permissions_filename, parse_permissions_file); +} --b5gNqxB1S1yM7hjW-- ------------------------------------------------------- SF.Net is sponsored by: Speed Start Your Linux Apps Now. Build and deploy apps & Web services for Linux with a free DVD software kit from IBM. Click Now! http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel