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
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
# 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
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
- @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
- @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:
- $(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:
- - 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:
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
+ - rmdir $(configdir)/rules.d
+ - rmdir $(configdir)/permissions.d
+ - rmdir $(configdir)
- rm $(initdir)/udev
- rm $(sbindir)/$(ROOT)
- rm $(sbindir)/$(DAEMON)
- rm $(sbindir)/$(SENDER)
+ - rm $(sbindir)/$(STARTER)
- rm $(usrbindir)/$(INFO)
+ - rm $(usrbindir)/$(TESTER)
- rmdir $(hotplugdir)
- - rmdir $(configdir)
- rm $(udevdir)/.udev.tdb
- rmdir $(udevdir)
@extras="$(EXTRAS)" ; for target in $$extras ; do \
.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
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
-.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.
.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="@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_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"
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.
-.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
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
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;
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;
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");
- if (temp)
+ if (temp != NULL) {
strfieldcpy(sysfs_path, temp);
+ no_leading_slash(sysfs_path);
+ }
+
temp = getenv("UDEV_CONFIG_FILE");
- if (temp)
+ if (temp != NULL)
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);
+
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)
init_variables();
get_dirs();
}
-
-
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];
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;
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);