chiark / gitweb /
[PATCH] udev default config layout changes
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Sat, 24 Apr 2004 04:50:27 +0000 (21:50 -0700)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:35:17 +0000 (21:35 -0700)
Here we catch up, after the default config changes.

o the man page is updated to reflect the new default config

o /etc/udev/rules.d/ + permissions.d/ dirs are created now

o udev.rules is installed in /etc/udev/rules.d/50-udev.rules
  so the user can easily order the files by prepending a number.
  (RedHat has the same name in the last rpm.)

o defined directory names in the Makefile are all without slashes now,
  not the first half with and the remaining without.

o all binaries are uninstalled now

o leading slashes in config values are now removed or prepended while the
  config is parsed, so we are more robust if the usere changes something.

o replaced the macros from udev_config.c with real code, cause we can
  skip if the value matches and not useless iterate over the remaining
  fields.

o config parsing errors are logged with info() now, fixes the bug where
  we report a error with debug_parse(), even when there isn't one

Makefile
udev.8.in
udev_config.c
udev_lib.c
udev_lib.h

index 7969c0f51dc54df6fd1c8883444ebf329cfb3d6e..7c716e852e5956ad16474a5aceb353601351da33 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -51,9 +51,9 @@ sbindir =     ${exec_prefix}/sbin
 usrbindir =    ${exec_prefix}/usr/bin
 mandir =       ${prefix}/usr/share/man
 hotplugdir =   ${etcdir}/hotplug.d/default
 usrbindir =    ${exec_prefix}/usr/bin
 mandir =       ${prefix}/usr/share/man
 hotplugdir =   ${etcdir}/hotplug.d/default
-configdir =    ${etcdir}/udev/
-initdir =      ${etcdir}/init.d/
-dev_ddir =     ${etcdir}/dev.d/
+configdir =    ${etcdir}/udev
+initdir =      ${etcdir}/init.d
+dev_ddir =     ${etcdir}/dev.d
 srcdir = .
 
 INSTALL = /usr/bin/install -c
 srcdir = .
 
 INSTALL = /usr/bin/install -c
@@ -228,16 +228,16 @@ GEN_HEADERS =     udev_version.h
 
 # Rules on how to create the generated header files
 udev_version.h:
 
 # Rules on how to create the generated header files
 udev_version.h:
-       @echo \#define UDEV_VERSION     \"$(VERSION)\" > $@
-       @echo \#define UDEV_ROOT        \"$(udevdir)/\" >> $@
-       @echo \#define UDEV_DB          \"$(udevdir)/\.udev.tdb\" >> $@
-       @echo \#define UDEV_CONFIG_DIR  \"$(configdir)\" >> $@
-       @echo \#define UDEV_CONFIG_FILE \"$(configdir)\udev.conf\" >> $@
-       @echo \#define UDEV_RULES_FILE  \"$(configdir)\udev.rules\" >> $@
-       @echo \#define UDEV_PERMISSION_FILE     \"$(configdir)\udev.permissions\" >> $@
-       @echo \#define UDEV_LOG_DEFAULT \"yes\" >> $@
-       @echo \#define UDEV_BIN         \"$(DESTDIR)$(sbindir)/udev\" >> $@
-       @echo \#define UDEVD_BIN        \"$(DESTDIR)$(sbindir)/udevd\" >> $@
+       @echo \#define UDEV_VERSION             \"$(VERSION)\" > $@
+       @echo \#define UDEV_ROOT                \"$(udevdir)/\" >> $@
+       @echo \#define UDEV_DB                  \"$(udevdir)/.udev.tdb\" >> $@
+       @echo \#define UDEV_CONFIG_DIR          \"$(configdir)\" >> $@
+       @echo \#define UDEV_CONFIG_FILE         \"$(configdir)/udev.conf\" >> $@
+       @echo \#define UDEV_RULES_FILE          \"$(configdir)/rules.d\" >> $@
+       @echo \#define UDEV_PERMISSION_FILE     \"$(configdir)/permissions.d\" >> $@
+       @echo \#define UDEV_LOG_DEFAULT         \"yes\" >> $@
+       @echo \#define UDEV_BIN                 \"$(DESTDIR)$(sbindir)/udev\" >> $@
+       @echo \#define UDEVD_BIN                \"$(DESTDIR)$(sbindir)/udevd\" >> $@
 
 # config files automatically generated
 GEN_CONFIGS =  $(LOCAL_CFG_DIR)/udev.conf
 
 # config files automatically generated
 GEN_CONFIGS =  $(LOCAL_CFG_DIR)/udev.conf
@@ -343,29 +343,29 @@ install-initscript: etc/init.d/udev etc/init.d/udev.debian etc/init.d/udev.init.
        fi
 
 install-config: $(GEN_CONFIGS)
        fi
 
 install-config: $(GEN_CONFIGS)
-       $(INSTALL) -d $(DESTDIR)$(configdir)
-       @if [ ! -r $(DESTDIR)$(configdir)udev.conf ]; then \
+       $(INSTALL) -d $(DESTDIR)$(configdir)/rules.d
+       $(INSTALL) -d $(DESTDIR)$(configdir)/permissions.d
+       @if [ ! -r $(DESTDIR)$(configdir)/udev.conf ]; then \
                echo $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.conf $(DESTDIR)$(configdir); \
                $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.conf $(DESTDIR)$(configdir); \
        fi
                echo $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.conf $(DESTDIR)$(configdir); \
                $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.conf $(DESTDIR)$(configdir); \
        fi
-       @if [ ! -r $(DESTDIR)$(configdir)udev.rules ]; then \
-               echo $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.rules $(DESTDIR)$(configdir); \
-               $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.rules $(DESTDIR)$(configdir); \
+       @if [ ! -r $(DESTDIR)$(configdir)/rules.d/50-udev.rules ]; then \
+               echo $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.rules $(DESTDIR)$(configdir)/rules.d/50-udev.rules; \
+               $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.rules $(DESTDIR)$(configdir)/rules.d/50-udev.rules; \
        fi
        fi
-       @if [ ! -r $(DESTDIR)$(configdir)udev.permissions ]; then \
-               echo $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.permissions $(DESTDIR)$(configdir); \
-               $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.permissions $(DESTDIR)$(configdir); \
+       @if [ ! -r $(DESTDIR)$(configdir)/permissions.d/50-udev.permissions ]; then \
+               echo $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.permissions $(DESTDIR)$(configdir)/permissions.d/50-udev.permissions; \
+               $(INSTALL_DATA) $(LOCAL_CFG_DIR)/udev.permissions $(DESTDIR)$(configdir)/permissions.d/50-udev.permissions; \
        fi
 
 install-dev.d:
        fi
 
 install-dev.d:
-       $(INSTALL) -d $(DESTDIR)$(dev_ddir)
-       $(INSTALL) -d $(DESTDIR)$(dev_ddir)default/
-       $(INSTALL_PROGRAM) -D etc/dev.d/net/hotplug.dev $(DESTDIR)$(dev_ddir)net/hotplug.dev
+       $(INSTALL) -d $(DESTDIR)$(dev_ddir)/default
+       $(INSTALL_PROGRAM) -D etc/dev.d/net/hotplug.dev $(DESTDIR)$(dev_ddir)/net/hotplug.dev
 
 uninstall-dev.d:
 
 uninstall-dev.d:
-       - rm $(dev_ddir)net/hotplug.dev
-       - rmdir $(dev_ddir)net
-       - rmdir $(dev_ddir)default
+       - rm $(dev_ddir)/net/hotplug.dev
+       - rmdir $(dev_ddir)/net
+       - rmdir $(dev_ddir)/default
        - rmdir $(dev_ddir)
 
 install-man:
        - rmdir $(dev_ddir)
 
 install-man:
@@ -406,16 +406,20 @@ endif
 
 uninstall: uninstall-man uninstall-dev.d
        - rm $(hotplugdir)/udev.hotplug
 
 uninstall: uninstall-man uninstall-dev.d
        - rm $(hotplugdir)/udev.hotplug
-       - rm $(configdir)/udev.permissions
-       - rm $(configdir)/udev.rules
+       - rm $(configdir)/rules.d/50-udev.rules
+       - rm $(configdir)/permissions.d/50-udev.permissions
        - rm $(configdir)/udev.conf
        - rm $(configdir)/udev.conf
+       - rmdir $(configdir)/rules.d
+       - rmdir $(configdir)/permissions.d
+       - rmdir $(configdir)
        - rm $(initdir)/udev
        - rm $(sbindir)/$(ROOT)
        - rm $(sbindir)/$(DAEMON)
        - rm $(sbindir)/$(SENDER)
        - rm $(initdir)/udev
        - rm $(sbindir)/$(ROOT)
        - rm $(sbindir)/$(DAEMON)
        - rm $(sbindir)/$(SENDER)
+       - rm $(sbindir)/$(STARTER)
        - rm $(usrbindir)/$(INFO)
        - rm $(usrbindir)/$(INFO)
+       - rm $(usrbindir)/$(TESTER)
        - rmdir $(hotplugdir)
        - rmdir $(hotplugdir)
-       - rmdir $(configdir)
        - rm $(udevdir)/.udev.tdb
        - rmdir $(udevdir)
        @extras="$(EXTRAS)" ; for target in $$extras ; do \
        - rm $(udevdir)/.udev.tdb
        - rmdir $(udevdir)
        @extras="$(EXTRAS)" ; for target in $$extras ; do \
index f803578968f201ff5dec78cc5442d6792ffdf6d5..6d1dfd9d189f2220423f0394b9bda32e36b45c05 100644 (file)
--- a/udev.8.in
+++ b/udev.8.in
@@ -77,7 +77,7 @@ in this file:
 .B udev_root
 Indicates where to place the device nodes in the filesystem. The default
 value is
 .B udev_root
 Indicates where to place the device nodes in the filesystem. The default
 value is
-.IR @udevdir@ .
+.IR @udevdir@/ .
 .TP
 .B udev_db
 The name and location of the udev database. The default value is
 .TP
 .B udev_db
 The name and location of the udev database. The default value is
@@ -87,14 +87,14 @@ The name and location of the udev database. The default value is
 The name of the udev rules file or directory to look for files with the suffix
 .IR .rules .
 All rule files are read in lexical order. The default value is
 The name of the udev rules file or directory to look for files with the suffix
 .IR .rules .
 All rule files are read in lexical order. The default value is
-.IR /etc/udev/udev.rules .
+.IR /etc/udev/rules.d/ .
 .TP
 .B udev_permissions
 The name of the udev permission file or directory to look for files with the
 suffix
 .IR .permissions .
 All permission files are read in lexical order. The default value is
 .TP
 .B udev_permissions
 The name of the udev permission file or directory to look for files with the
 suffix
 .IR .permissions .
 All permission files are read in lexical order. The default value is
-.IR /etc/udev/udev.permissions .
+.IR /etc/udev/permissions.d/ .
 .TP
 .B udev_log
 The switch, if udev logs some information for every device handled.
 .TP
 .B udev_log
 The switch, if udev logs some information for every device handled.
@@ -121,17 +121,17 @@ file. The default value is
 .sp
 .nf
 # udev_root - where to place the device nodes in the filesystem
 .sp
 .nf
 # udev_root - where to place the device nodes in the filesystem
-udev_root="@udevdir@"
+udev_root="/udev"
 
 # udev_db - The name and location of the udev database
 
 # udev_db - The name and location of the udev database
-udev_db="@udevdir@/.udev.tdb"
+udev_db="/udev/.udev.tdb"
 
 # udev_rules - The name of the udev rules file or directory to look
                for files with the suffix .rules
 udev_rules="/etc/udev/rules.d/"
 
 
 # udev_rules - The name of the udev rules file or directory to look
                for files with the suffix .rules
 udev_rules="/etc/udev/rules.d/"
 
-# udev_permissions - The name of the udev permission file or directry to look
-                     for files with the suffix .permissions
+# udev_permissions - The name of the udev permission file or directory
+                     to look for files with the suffix .permissions
 udev_permissions="/etc/udev/udev.permissions"
 
 # udev_log - set to "yes" if you want logging, else "no"
 udev_permissions="/etc/udev/udev.permissions"
 
 # udev_log - set to "yes" if you want logging, else "no"
@@ -150,14 +150,14 @@ default_owner="root"
 default_group="root"
 .fi
 .P
 default_group="root"
 .fi
 .P
-The rules for udev to use when naming devices may specified in
-.I /etc/udev/udev.rules
-or by the
+The rules for device naming, are read from the files located in the
+.I /etc/udev/rules.d/
+directory, or at the location specified by the
 .I udev_rules
 value in the
 .I /etc/udev/udev.conf
 file.
 .I udev_rules
 value in the
 .I /etc/udev/udev.conf
 file.
-.P
+.br
 Every line in the rules file defines the mapping between device attributes
 and the device name. One or more keys are specified to match a rule with
 the current device. If all keys are matching, the rule will be applied and
 Every line in the rules file defines the mapping between device attributes
 and the device name. One or more keys are specified to match a rule with
 the current device. If all keys are matching, the rule will be applied and
@@ -304,9 +304,10 @@ KERNEL="ttyUSB1", NAME="pda", SYMLINK="palmtop handheld"
 BUS="usb", SYSFS{model}="XV3", NAME="video%n", SYMLINK="webcam%n"
 .fi
 .P
 BUS="usb", SYSFS{model}="XV3", NAME="video%n", SYMLINK="webcam%n"
 .fi
 .P
-Permissions and ownership for the created device files may specified in
-.I /etc/udev/udev.permissions
-or by the
+The permissions and ownership of the created device file is read from
+the files located in the
+.I /etc/udev/permissions.d/
+directory, or at the location specified by the
 .I udev_permission
 value in the
 .I /etc/udev/udev.conf
 .I udev_permission
 value in the
 .I /etc/udev/udev.conf
index ba04003e909285c89349f2178c4d1f82da37dd38..51a91d009260db4b12a4710493818059863b9e56 100644 (file)
@@ -84,18 +84,6 @@ static void init_variables(void)
                udev_dev_d = 0;
 }
 
                udev_dev_d = 0;
 }
 
-#define set_var(_name, _var)                           \
-       if (strcasecmp(variable, _name) == 0) {         \
-               dbg_parse("%s='%s'", _name, value);     \
-               strfieldcpy(_var, value);\
-       }
-
-#define set_bool(_name, _var)                          \
-       if (strcasecmp(variable, _name) == 0) {         \
-               dbg_parse("%s='%s'", _name, value);     \
-               _var = string_is_true(value);           \
-       }
-
 int parse_get_pair(char **orig_string, char **left, char **right)
 {
        char *temp;
 int parse_get_pair(char **orig_string, char **left, char **right)
 {
        char *temp;
@@ -181,22 +169,58 @@ static int parse_config_file(void)
                        continue;
 
                retval = parse_get_pair(&temp, &variable, &value);
                        continue;
 
                retval = parse_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_permissions_filename);
-               set_var("default_mode", default_mode_str);
-               set_var("default_owner", default_owner_str);
-               set_var("default_group", default_group_str);
-               set_bool("udev_log", udev_log);
+               if (retval != 0)
+                       info("%s:%d:%Zd: error parsing '%s'",
+                            udev_config_filename, lineno, temp-line, temp);
+
+               dbg_parse("variable='%s', value='%s'", variable, value);
+
+               if (strcasecmp(variable, "udev_root") == 0) {
+                       strfieldcpy(udev_root, value);
+                       leading_slash(udev_root);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "udev_db") == 0) {
+                       strfieldcpy(udev_db_filename, value);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "udev_rules") == 0) {
+                       strfieldcpy(udev_rules_filename, value);
+                       no_leading_slash(udev_rules_filename);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "udev_permissions") == 0) {
+                       strfieldcpy(udev_permissions_filename, value);
+                       no_leading_slash(udev_permissions_filename);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "default_mode") == 0) {
+                       strfieldcpy(default_mode_str, value);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "default_owner") == 0) {
+                       strfieldcpy(default_owner_str, value);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "default_group") == 0) {
+                       strfieldcpy(default_group_str, value);
+                       continue;
+               }
+
+               if (strcasecmp(variable, "udev_log") == 0) {
+                       udev_log = string_is_true(value);
+                       continue;
+               }
+
+               info("%s:%d:%Zd: unknown key '%s'",
+                    udev_config_filename, lineno, temp-line, temp);
        }
        }
-       dbg_parse("%s:%d:%Zd: error parsing '%s'", udev_config_filename,
-                 lineno, temp - line, temp);
 
        file_unmap(buf, bufsize);
        return retval;
 
        file_unmap(buf, bufsize);
        return retval;
@@ -212,32 +236,34 @@ static void get_dirs(void)
                dbg("sysfs_get_mnt_path failed");
 
        /* see if we should try to override any of the default values */
                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 */
+       if (getenv("UDEV_TEST") != NULL) {
                temp = getenv("SYSFS_PATH");
                temp = getenv("SYSFS_PATH");
-               if (temp)
+               if (temp != NULL) {
                        strfieldcpy(sysfs_path, temp);
                        strfieldcpy(sysfs_path, temp);
+                       no_leading_slash(sysfs_path);
+               }
+
                temp = getenv("UDEV_CONFIG_FILE");
                temp = getenv("UDEV_CONFIG_FILE");
-               if (temp)
+               if (temp != NULL)
                        strfieldcpy(udev_config_filename, temp);
        }
                        strfieldcpy(udev_config_filename, temp);
        }
-       dbg("sysfs_path='%s'", sysfs_path);
 
 
+       dbg("sysfs_path='%s'", sysfs_path);
        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_permissions_filename = %s", udev_permissions_filename);
        dbg_parse("udev_log = %d", udev_log);
        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_permissions_filename = %s", udev_permissions_filename);
        dbg_parse("udev_log = %d", udev_log);
+
        parse_config_file();
 
        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_permissions_filename = %s", udev_permissions_filename);
-       dbg_parse("udev_log_str = %d", udev_log);
+       dbg("udev_root = %s", udev_root);
+       dbg("udev_config_filename = %s", udev_config_filename);
+       dbg("udev_db_filename = %s", udev_db_filename);
+       dbg("udev_rules_filename = %s", udev_rules_filename);
+       dbg("udev_permissions_filename = %s", udev_permissions_filename);
+       dbg("udev_log_str = %d", udev_log);
 }
 
 void udev_init_config(void)
 }
 
 void udev_init_config(void)
@@ -245,5 +271,3 @@ void udev_init_config(void)
        init_variables();
        get_dirs();
 }
        init_variables();
        get_dirs();
 }
-
-
index 381492db01feb4bf51f0cf84f7c5250b20759fac..16b473f57608058177702f46b162faeb13f7bf99 100644 (file)
@@ -152,6 +152,26 @@ size_t buf_get_line(char *buf, size_t buflen, size_t cur)
        return count - cur;
 }
 
        return count - cur;
 }
 
+void leading_slash(char *path)
+{
+       int len;
+
+       len = strlen(path);
+       if (len > 0 && path[len-1] != '/') {
+               path[len] = '/';
+               path[len+1] = '\0';
+       }
+}
+
+void no_leading_slash(char *path)
+{
+       int len;
+
+       len = strlen(path);
+       if (len > 0 && path[len-1] == '/')
+               path[len-1] = '\0';
+}
+
 struct files {
        struct list_head list;
        char name[NAME_SIZE];
 struct files {
        struct list_head list;
        char name[NAME_SIZE];
@@ -180,7 +200,7 @@ static int file_list_insert(char *filename, struct list_head *file_list)
        return 0;
 }
 
        return 0;
 }
 
-/* calls function for file or every file found in directory */
+/* calls function for every file found in specified directory */
 int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
 {
        struct dirent *ent;
 int call_foreach_file(int fnct(char *f) , char *dirname, char *suffix)
 {
        struct dirent *ent;
index cc264fa9b4ce27f9ebd496483d053aee4e1b1ae4..18ce25ccc791475a450888747171ebc22fe7065b 100644 (file)
@@ -75,6 +75,8 @@ extern char get_device_type(const char *path, const char *subsystem);
 extern int file_map(const char *filename, char **buf, size_t *bufsize);
 extern void file_unmap(char *buf, size_t bufsize);
 extern size_t buf_get_line(char *buf, size_t buflen, size_t cur);
 extern int file_map(const char *filename, char **buf, size_t *bufsize);
 extern void file_unmap(char *buf, size_t bufsize);
 extern size_t buf_get_line(char *buf, size_t buflen, size_t cur);
+extern void leading_slash(char *path);
+extern void no_leading_slash(char *path);
 extern int  call_foreach_file(int fnct(char *f) , char *filename, char *extension);
 
 
 extern int  call_foreach_file(int fnct(char *f) , char *filename, char *extension);