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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).