[PATCH] udev default config layout changes

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
This commit is contained in:
kay.sievers@vrfy.org 2004-04-23 21:50:27 -07:00 committed by Greg KH
parent da361dd7df
commit aef6bb132e
5 changed files with 136 additions and 85 deletions

View file

@ -51,9 +51,9 @@ sbindir = ${exec_prefix}/sbin
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
@ -228,16 +228,16 @@ GEN_HEADERS = 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
@ -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)
$(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:
@ -406,16 +406,20 @@ endif
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 \

View file

@ -77,7 +77,7 @@ in this file:
.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
@ -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
.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.
@ -121,17 +121,17 @@ file. The default value is
.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"
@ -150,14 +150,14 @@ default_owner="root"
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
@ -304,9 +304,10 @@ KERNEL="ttyUSB1", NAME="pda", SYMLINK="palmtop handheld"
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

View file

@ -84,18 +84,6 @@ static void init_variables(void)
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;
@ -181,22 +169,58 @@ static int parse_config_file(void)
continue;
retval = parse_get_pair(&temp, &variable, &value);
if (retval)
break;
dbg_parse("variable = '%s', value = '%s'", variable, value);
if (retval != 0)
info("%s:%d:%Zd: error parsing '%s'",
udev_config_filename, lineno, temp-line, temp);
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);
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;
@ -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 */
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)
@ -245,5 +271,3 @@ void udev_init_config(void)
init_variables();
get_dirs();
}

View file

@ -152,6 +152,26 @@ size_t buf_get_line(char *buf, size_t buflen, size_t 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];
@ -180,7 +200,7 @@ static int file_list_insert(char *filename, struct list_head *file_list)
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;

View 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 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);