From e8bacccab296d6b75c4c9f43cb4e71007aff5b8a Mon Sep 17 00:00:00 2001 From: "greg@kroah.com" Date: Wed, 3 Dec 2003 01:08:46 -0800 Subject: [PATCH] [PATCH] add support for a main udev config file, udev.conf. the older udev.config file is now called udev.rules. This allows us to better control configuration values, and move away from the environment variables. --- Makefile | 7 +- namedev.c | 2 +- namedev.h | 5 +- namedev_parse.c | 24 ++- test/{label_test.config => label_test.rules} | 0 ...difier_test.config => modifier_test.rules} | 0 ...replace_test.config => replace_test.rules} | 0 test/{topo_test.config => topo_test.rules} | 0 udev.c | 60 +----- udev.conf | 23 +++ udev.h | 17 +- udev.config => udev.rules | 0 udev.config.demo => udev.rules.demo | 0 udev.spec | 6 +- udev_config.c | 195 ++++++++++++++++++ 15 files changed, 265 insertions(+), 74 deletions(-) rename test/{label_test.config => label_test.rules} (100%) rename test/{modifier_test.config => modifier_test.rules} (100%) rename test/{replace_test.config => replace_test.rules} (100%) rename test/{topo_test.config => topo_test.rules} (100%) create mode 100644 udev.conf rename udev.config => udev.rules (100%) rename udev.config.demo => udev.rules.demo (100%) create mode 100644 udev_config.c diff --git a/Makefile b/Makefile index 340ca87f2..d95aedc1a 100644 --- a/Makefile +++ b/Makefile @@ -154,6 +154,7 @@ SYSFS = libsysfs/sysfs_bus.o \ libsysfs/dlist.o OBJS = udev.o \ + udev_config.o \ udev-add.o \ udev-remove.o \ udevdb.o \ @@ -226,7 +227,8 @@ install: all $(INSTALL) -d $(DESTDIR)$(hotplugdir) $(INSTALL_PROGRAM) -D $(ROOT) $(DESTDIR)$(sbindir)/$(ROOT) $(INSTALL_DATA) -D udev.8 $(DESTDIR)$(mandir)/man8/udev.8 - $(INSTALL_DATA) udev.config $(DESTDIR)$(configdir) + $(INSTALL_DATA) udev.conf $(DESTDIR)$(configdir) + $(INSTALL_DATA) udev.rules $(DESTDIR)$(configdir) $(INSTALL_DATA) udev.permissions $(DESTDIR)$(configdir) - rm -f $(DESTDIR)$(hotplugdir)/udev.hotplug - ln -s $(sbindir)/$(ROOT) $(DESTDIR)$(hotplugdir)/udev.hotplug @@ -234,7 +236,8 @@ install: all uninstall: - rm $(hotplugdir)/udev.hotplug - rm $(configdir)/udev.permissions - - rm $(configdir)/udev.config + - rm $(configdir)/udev.rules + - rm $(configdir)/udev.conf - rm $(mandir)/man8/udev.8 - rm $(sbindir)/$(ROOT) - rmdir $(hotplugdir) diff --git a/namedev.c b/namedev.c index 86685f839..a81721a9c 100644 --- a/namedev.c +++ b/namedev.c @@ -606,7 +606,7 @@ int namedev_init(void) { int retval; - retval = namedev_init_config(); + retval = namedev_init_rules(); if (retval) return retval; diff --git a/namedev.h b/namedev.h index 1405d07e0..94fdf4ac9 100644 --- a/namedev.h +++ b/namedev.h @@ -28,7 +28,6 @@ struct sysfs_class_device; -#define COMMENT_CHARACTER '#' enum config_type { KERNEL_NAME = 0, /* must be 0 to let memset() default to this value */ @@ -76,10 +75,12 @@ extern struct list_head config_device_list; extern int namedev_init(void); extern int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *dev); extern int namedev_init_permissions(void); -extern int namedev_init_config(void); +extern int namedev_init_rules(void); extern int add_config_dev(struct config_device *new_dev); extern void dump_config_dev(struct config_device *dev); extern void dump_config_dev_list(void); +extern int get_pair(char **orig_string, char **left, char **right); + #endif diff --git a/namedev_parse.c b/namedev_parse.c index a752b3305..bd23867e1 100644 --- a/namedev_parse.c +++ b/namedev_parse.c @@ -36,7 +36,7 @@ #include "udev.h" #include "namedev.h" -static int get_pair(char **orig_string, char **left, char **right) +int get_pair(char **orig_string, char **left, char **right) { char *temp; char *string = *orig_string; @@ -137,7 +137,7 @@ void dump_config_dev_list(void) } } -int namedev_init_config(void) +int namedev_init_rules(void) { char line[255]; int lineno; @@ -148,10 +148,11 @@ int namedev_init_config(void) int retval = 0; struct config_device dev; - dbg("opening '%s' to read as config", udev_config_filename); - fd = fopen(udev_config_filename, "r"); - if (fd == NULL) { - dbg("can't open '%s'", udev_config_filename); + fd = fopen(udev_rules_filename, "r"); + if (fd != NULL) { + dbg("reading '%s' as rules file", udev_rules_filename); + } else { + dbg("can't open '%s' as a rules file", udev_rules_filename); return -ENODEV; } @@ -328,7 +329,7 @@ int namedev_init_config(void) goto exit; } } - dbg_parse("%s:%d:%Zd: error parsing '%s'", udev_config_filename, + dbg_parse("%s:%d:%Zd: error parsing '%s'", udev_rules_filename, lineno, temp - line, temp); exit: fclose(fd); @@ -345,10 +346,11 @@ int namedev_init_permissions(void) int retval = 0; struct config_device dev; - dbg("opening '%s' to read as permissions config", udev_config_permission_filename); - fd = fopen(udev_config_permission_filename, "r"); - if (fd == NULL) { - dbg("can't open '%s'", udev_config_permission_filename); + fd = fopen(udev_permission_filename, "r"); + if (fd != NULL) { + dbg("reading '%s' as permissions file", udev_permission_filename); + } else { + dbg("can't open '%s' as permissions file", udev_permission_filename); return -ENODEV; } diff --git a/test/label_test.config b/test/label_test.rules similarity index 100% rename from test/label_test.config rename to test/label_test.rules diff --git a/test/modifier_test.config b/test/modifier_test.rules similarity index 100% rename from test/modifier_test.config rename to test/modifier_test.rules diff --git a/test/replace_test.config b/test/replace_test.rules similarity index 100% rename from test/replace_test.config rename to test/replace_test.rules diff --git a/test/topo_test.config b/test/topo_test.rules similarity index 100% rename from test/topo_test.config rename to test/topo_test.rules diff --git a/udev.c b/udev.c index 094905ecc..272afbab6 100644 --- a/udev.c +++ b/udev.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "udev.h" #include "udev_version.h" @@ -39,11 +40,13 @@ char **main_argv; char **main_envp; char sysfs_path[SYSFS_PATH_MAX]; -char *udev_config_dir = UDEV_CONFIG_DIR; -char *udev_root = UDEV_ROOT; +char udev_config_dir[PATH_MAX]; +char udev_root[PATH_MAX]; char udev_db_filename[PATH_MAX+NAME_MAX]; -char udev_config_permission_filename[PATH_MAX+NAME_MAX]; +char udev_permission_filename[PATH_MAX+NAME_MAX]; +char udev_rules_filename[PATH_MAX+NAME_MAX]; char udev_config_filename[PATH_MAX+NAME_MAX]; +char default_mode_str[NAME_MAX]; static inline char *get_action(void) @@ -70,53 +73,6 @@ static inline char *get_seqnum(void) return seqnum; } -static void get_dirs(void) -{ - char *temp; - char *udev_db = UDEV_DB; - char *udev_config = UDEV_CONFIG_FILE; - char *udev_permission = UDEV_CONFIG_PERMISSION_FILE; - int retval; - - retval = sysfs_get_mnt_path(sysfs_path, SYSFS_PATH_MAX); - if (retval) - dbg("sysfs_get_mnt_path failed"); - - /* see if we should try to override any of the default values */ - temp = getenv("UDEV_TEST"); - if (temp != NULL) { - /* hm testing is happening, use the specified values, if they are present */ - temp = getenv("SYSFS_PATH"); - if (temp) - strncpy(sysfs_path, temp, sizeof(sysfs_path)); - temp = getenv("UDEV_CONFIG_DIR"); - if (temp) - udev_config_dir = temp; - temp = getenv("UDEV_ROOT"); - if (temp) - udev_root = temp; - temp = getenv("UDEV_DB"); - if (temp) - udev_db = temp; - temp = getenv("UDEV_CONFIG_FILE"); - if (temp) - udev_config = temp; - temp = getenv("UDEV_PERMISSION_FILE"); - if (temp) - udev_permission = temp; - } - dbg("sysfs_path='%s'", sysfs_path); - - strncpy(udev_db_filename, udev_root, sizeof(udev_db_filename)); - strncat(udev_db_filename, udev_db, sizeof(udev_db_filename)); - - strncpy(udev_config_filename, udev_config_dir, sizeof(udev_config_filename)); - strncat(udev_config_filename, udev_config, sizeof(udev_config_filename)); - - strncpy(udev_config_permission_filename, udev_config_dir, sizeof(udev_config_permission_filename)); - strncat(udev_config_permission_filename, udev_permission, sizeof(udev_config_permission_filename)); -} - int main(int argc, char **argv, char **envp) { char *action; @@ -162,8 +118,10 @@ int main(int argc, char **argv, char **envp) goto exit; } + /* initialize our configuration */ + udev_init_config(); + /* initialize udev database */ - get_dirs(); retval = udevdb_init(UDEVDB_DEFAULT); if (retval != 0) { dbg("unable to initialize database"); diff --git a/udev.conf b/udev.conf new file mode 100644 index 000000000..aadaea8a2 --- /dev/null +++ b/udev.conf @@ -0,0 +1,23 @@ +# udev.conf +# The main config file for udev +# +# This file can be used to override some of udev's default values +# for where it looks for files, and where it places device nodes. + + +# udev_root - where in the filesystem to place the device nodes +udev_root="/udev/" + +# udev_db - The name and location of the udev database. +udev_db="/udev/.udev.tdb" + +# udev_rules - The name and location of the udev rules file +udev_rules="/etc/udev/udev.rules" + +# udev_permissions - The name and location of the udev permission file +udev_permissions="/etc/udev/udev.permissions" + +# default_mode - set the default mode for all nodes that have no +# explicit match in the permissions file +default_mode="0666" + diff --git a/udev.h b/udev.h index 0c1951ad7..4acbb6139 100644 --- a/udev.h +++ b/udev.h @@ -51,10 +51,13 @@ extern int log_message (int level, const char *format, ...) __attribute__ ((format (printf, 2, 3))); -/* filenames for the config and database files */ +/* default filenames for the config and database files */ +#define UDEV_CONFIG_FILE "udev.conf" #define UDEV_DB ".udev.tdb" -#define UDEV_CONFIG_PERMISSION_FILE "udev.permissions" -#define UDEV_CONFIG_FILE "udev.config" +#define UDEV_RULES_FILE "udev.rules" +#define UDEV_PERMISSION_FILE "udev.permissions" + +#define COMMENT_CHARACTER '#' #define NAME_SIZE 100 #define OWNER_SIZE 30 @@ -84,14 +87,16 @@ do { \ extern int udev_add_device(char *path, char *subsystem); extern int udev_remove_device(char *path, char *subsystem); +extern void udev_init_config(void); extern char **main_argv; extern char **main_envp; extern char sysfs_path[SYSFS_PATH_MAX]; -extern char *udev_config_dir; -extern char *udev_root; +extern char udev_config_dir[PATH_MAX]; +extern char udev_root[PATH_MAX]; extern char udev_db_filename[PATH_MAX+NAME_MAX]; -extern char udev_config_permission_filename[PATH_MAX+NAME_MAX]; +extern char udev_permission_filename[PATH_MAX+NAME_MAX]; extern char udev_config_filename[PATH_MAX+NAME_MAX]; +extern char udev_rules_filename[PATH_MAX+NAME_MAX]; #endif diff --git a/udev.config b/udev.rules similarity index 100% rename from udev.config rename to udev.rules diff --git a/udev.config.demo b/udev.rules.demo similarity index 100% rename from udev.config.demo rename to udev.rules.demo diff --git a/udev.spec b/udev.spec index 0c30d613b..8cc424cac 100644 --- a/udev.spec +++ b/udev.spec @@ -32,12 +32,16 @@ rm -rf $RPM_BUILD_ROOT %attr(755,root,root) /sbin/udev %attr(755,root,root) /udev/ %attr(755,root,root) /etc/udev/ -%attr(0644,root,root) /etc/udev/udev.config +%attr(0644,root,root) /etc/udev/udev.conf +%attr(0644,root,root) /etc/udev/udev.rules %attr(0644,root,root) /etc/udev/udev.permissions %attr(-,root,root) /etc/hotplug.d/default/udev.hotplug %attr(0644,root,root) %{_mandir}/man8/udev.8* %changelog +* Tue Nov 2 2003 Greg Kroah-Hartman +- changes due to config file name changes + * Fri Oct 17 2003 Robert Love - Make work without a build root - Correctly install the right files diff --git a/udev_config.c b/udev_config.c new file mode 100644 index 000000000..262108dff --- /dev/null +++ b/udev_config.c @@ -0,0 +1,195 @@ +/* + * udev_config.c + * + * Userspace devfs + * + * Copyright (C) 2003 Greg Kroah-Hartman + * + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* define this to enable parsing debugging */ +/* #define DEBUG_PARSER */ + +#include +#include +#include +#include +#include +#include +#include + +#include "udev.h" +#include "udev_version.h" +#include "namedev.h" +#include "libsysfs/libsysfs.h" + +/* global variables */ +char sysfs_path[SYSFS_PATH_MAX]; +char udev_config_dir[PATH_MAX]; +char udev_root[PATH_MAX]; +char udev_db_filename[PATH_MAX+NAME_MAX]; +char udev_permission_filename[PATH_MAX+NAME_MAX]; +char udev_rules_filename[PATH_MAX+NAME_MAX]; +char udev_config_filename[PATH_MAX+NAME_MAX]; +char default_mode_str[NAME_MAX]; + + +static void init_variables(void) +{ + strfieldcpy(udev_root, UDEV_ROOT); + strfieldcpy(udev_config_dir, UDEV_CONFIG_DIR); +} + +#define set_var(_name, _var) \ + if (strcasecmp(variable, _name) == 0) { \ + dbg_parse("%s = '%s'", _name, value); \ + strncpy(_var, value, sizeof(_var)); \ + } + +static int parse_config_file(void) +{ + char line[255]; + char *temp; + char *variable; + char *value; + FILE *fd; + int lineno = 0; + int retval = 0; + + fd = fopen(udev_config_filename, "r"); + if (fd != NULL) { + dbg("reading '%s' as config file", udev_config_filename); + } else { + dbg("can't open '%s' as config file", udev_config_filename); + return -ENODEV; + } + + /* loop through the whole file */ + while (1) { + /* get a line */ + temp = fgets(line, sizeof(line), fd); + if (temp == NULL) + goto exit; + lineno++; + + dbg_parse("read '%s'", temp); + + /* eat the whitespace at the beginning of the line */ + while (isspace(*temp)) + ++temp; + + /* empty line? */ + if (*temp == 0x00) + continue; + + /* see if this is a comment */ + if (*temp == COMMENT_CHARACTER) + continue; + + retval = get_pair(&temp, &variable, &value); + if (retval) + break; + + dbg_parse("variable = '%s', value = '%s'", variable, value); + + set_var("udev_root", udev_root); + set_var("udev_db", udev_db_filename); + set_var("udev_rules", udev_rules_filename); + set_var("udev_permissions", udev_permission_filename); + set_var("default_mode", default_mode_str); + } + dbg_parse("%s:%d:%Zd: error parsing '%s'", udev_config_filename, + lineno, temp - line, temp); +exit: + fclose(fd); + return retval; +} + +static void get_dirs(void) +{ + char *temp; + char *udev_db = UDEV_DB; + char *udev_config = UDEV_CONFIG_FILE; + char *udev_rules = UDEV_RULES_FILE; + char *udev_permission = UDEV_PERMISSION_FILE; + int retval; + + retval = sysfs_get_mnt_path(sysfs_path, SYSFS_PATH_MAX); + if (retval) + dbg("sysfs_get_mnt_path failed"); + + /* see if we should try to override any of the default values */ + temp = getenv("UDEV_TEST"); + if (temp != NULL) { + /* hm testing is happening, use the specified values, if they are present */ + temp = getenv("SYSFS_PATH"); + if (temp) + strfieldcpy(sysfs_path, temp); + temp = getenv("UDEV_CONFIG_DIR"); + if (temp) + strfieldcpy(udev_config_dir, temp); + temp = getenv("UDEV_ROOT"); + if (temp) + strfieldcpy(udev_root, temp); + temp = getenv("UDEV_DB"); + if (temp) + udev_db = temp; + temp = getenv("UDEV_CONFIG_FILE"); + if (temp) + udev_config = temp; + temp = getenv("UDEV_RULES_FILE"); + if (temp) + udev_rules = temp; + temp = getenv("UDEV_PERMISSION_FILE"); + if (temp) + udev_permission = temp; + } + dbg("sysfs_path='%s'", sysfs_path); + + strncpy(udev_db_filename, udev_root, sizeof(udev_db_filename)); + strncat(udev_db_filename, udev_db, sizeof(udev_db_filename)); + + strncpy(udev_config_filename, udev_config_dir, sizeof(udev_config_filename)); + strncat(udev_config_filename, udev_config, sizeof(udev_config_filename)); + + strncpy(udev_rules_filename, udev_config_dir, sizeof(udev_permission_filename)); + strncat(udev_rules_filename, udev_rules, sizeof(udev_permission_filename)); + + strncpy(udev_permission_filename, udev_config_dir, sizeof(udev_permission_filename)); + strncat(udev_permission_filename, udev_permission, sizeof(udev_permission_filename)); + + dbg_parse("udev_root = %s", udev_root); + dbg_parse("udev_config_filename = %s", udev_config_filename); + dbg_parse("udev_db_filename = %s", udev_db_filename); + dbg_parse("udev_rules_filename = %s", udev_rules_filename); + dbg_parse("udev_permission_filename = %s", udev_permission_filename); + parse_config_file(); + + dbg_parse("udev_root = %s", udev_root); + dbg_parse("udev_config_filename = %s", udev_config_filename); + dbg_parse("udev_db_filename = %s", udev_db_filename); + dbg_parse("udev_rules_filename = %s", udev_rules_filename); + dbg_parse("udev_permission_filename = %s", udev_permission_filename); +} + +void udev_init_config(void) +{ + init_variables(); + get_dirs(); +} + + -- 2.30.2