From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: [PATCH] udev - allow all files in a directory as the config
Date: Fri, 20 Feb 2004 01:56:46 +0000 [thread overview]
Message-ID: <20040220015646.GA13016@vrfy.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 534 bytes --]
I was on the train for 5 hours today and the TODO is almost empty :)
So, at least four people wanted this feature, then here is a actual
working patch.
We may specify now in udev.conf:
udev_rules="/etc/udev/"
and udev will scan the whole directory for files ending with *.rules,
sort it in lexical order and create our rule list from all of the files.
A plain given file will still work and the same applies to the *.permissions.
I sort the files in our usual linked list, cause klibc has no scandir().
please have a look,
Kay
[-- Attachment #2: 01-dir-as-config.diff --]
[-- Type: text/plain, Size: 4963 bytes --]
===== namedev.h 1.25 vs edited =====
--- 1.25/namedev.h Mon Feb 16 05:17:27 2004
+++ edited/namedev.h Thu Feb 19 14:56:44 2004
@@ -48,9 +48,11 @@
#define ATTR_PARTITIONS "all_partitions"
#define PARTITIONS_COUNT 15
-
#define PROGRAM_MAXARG 10
#define MAX_SYSFS_PAIRS 5
+
+#define RULEFILE_EXT ".rules"
+#define PERMFILE_EXT ".permissions"
struct sysfs_pair {
char file[FILE_SIZE];
===== namedev_parse.c 1.26 vs edited =====
--- 1.26/namedev_parse.c Mon Feb 16 05:17:27 2004
+++ edited/namedev_parse.c Fri Feb 20 02:52:38 2004
@@ -33,12 +33,16 @@
#include <fcntl.h>
#include <ctype.h>
#include <unistd.h>
+#include <sys/stat.h>
+#include <dirent.h>
#include <errno.h>
#include "udev.h"
#include "logging.h"
#include "namedev.h"
+LIST_HEAD(file_list);
+
static int add_config_dev(struct config_device *new_dev)
{
struct config_device *tmp_dev;
@@ -114,7 +118,7 @@
return NULL;
}
-int namedev_init_rules(void)
+static int namedev_parse_rules(char *filename)
{
char line[255];
int lineno;
@@ -127,11 +131,11 @@
int retval = 0;
struct config_device dev;
- fd = fopen(udev_rules_filename, "r");
+ fd = fopen(filename, "r");
if (fd != NULL) {
- dbg("reading '%s' as rules file", udev_rules_filename);
+ dbg("reading '%s' as rules file", filename);
} else {
- dbg("can't open '%s' as a rules file", udev_rules_filename);
+ dbg("can't open '%s' as a rules file", filename);
return -ENODEV;
}
@@ -262,7 +266,7 @@
continue;
error:
dbg("%s:%d:%d: parse error, rule skipped",
- udev_rules_filename, lineno, temp - line);
+ filename, lineno, temp - line);
}
}
exit:
@@ -270,7 +274,7 @@
return retval;
}
-int namedev_init_permissions(void)
+static int namedev_parse_permissions(char *filename)
{
char line[255];
char *temp;
@@ -279,11 +283,11 @@
int retval = 0;
struct perm_device dev;
- fd = fopen(udev_permissions_filename, "r");
+ fd = fopen(filename, "r");
if (fd != NULL) {
- dbg("reading '%s' as permissions file", udev_permissions_filename);
+ dbg("reading '%s' as permissions file", filename);
} else {
- dbg("can't open '%s' as permissions file", udev_permissions_filename);
+ dbg("can't open '%s' as permissions file", filename);
return -ENODEV;
}
@@ -352,3 +356,88 @@
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)
+{
+ 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);
+ 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);
+ strcat(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);
+}
+
+int namedev_init_permissions()
+{
+ return call_foreach_file(namedev_parse_permissions, udev_permissions_filename, PERMFILE_EXT);
+}
===== udev.c 1.46 vs edited =====
--- 1.46/udev.c Tue Feb 17 14:16:03 2004
+++ edited/udev.c Thu Feb 19 16:26:45 2004
@@ -111,13 +111,13 @@
action = get_action();
if (!action) {
- dbg ("no action?");
+ dbg("no action?");
goto exit;
}
devpath = get_devpath();
if (!devpath) {
- dbg ("no devpath?");
+ dbg("no devpath?");
goto exit;
}
dbg("looking at '%s'", devpath);
@@ -131,6 +131,10 @@
/* skip blacklisted subsystems */
subsystem = argv[1];
+ if (!subsystem) {
+ dbg("no subsystem?");
+ goto exit;
+ }
i = 0;
while (subsystem_blacklist[i][0] != '\0') {
if (strcmp(subsystem, subsystem_blacklist[i]) == 0) {
next reply other threads:[~2004-02-20 1:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-20 1:56 Kay Sievers [this message]
2004-02-20 12:30 ` [PATCH] udev - allow all files in a directory as the config Marco d'Itri
2004-02-23 19:32 ` Greg KH
2004-02-23 20:21 ` Kay Sievers
2004-02-26 20:55 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040220015646.GA13016@vrfy.org \
--to=kay.sievers@vrfy.org \
--cc=linux-hotplug@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.