aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgreg@kroah.com <greg@kroah.com>2003-12-03 01:08:46 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:13:05 -0700
commite8bacccab296d6b75c4c9f43cb4e71007aff5b8a (patch)
treead65d8917550ec7e8addf84816e16452fd722986
parent29b82deb7e8d7634792bd50be1377bae170a8acb (diff)
downloadudev-e8bacccab296d6b75c4c9f43cb4e71007aff5b8a.tar.gz
[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.
-rw-r--r--Makefile7
-rw-r--r--namedev.c2
-rw-r--r--namedev.h5
-rw-r--r--namedev_parse.c24
-rw-r--r--test/label_test.rules (renamed from test/label_test.config)0
-rw-r--r--test/modifier_test.rules (renamed from test/modifier_test.config)0
-rw-r--r--test/replace_test.rules (renamed from test/replace_test.config)0
-rw-r--r--test/topo_test.rules (renamed from test/topo_test.config)0
-rw-r--r--udev.c60
-rw-r--r--udev.conf23
-rw-r--r--udev.h17
-rw-r--r--udev.rules (renamed from udev.config)0
-rw-r--r--udev.rules.demo (renamed from udev.config.demo)0
-rw-r--r--udev.spec6
-rw-r--r--udev_config.c195
15 files changed, 265 insertions, 74 deletions
diff --git a/Makefile b/Makefile
index 340ca87f..d95aedc1 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 86685f83..a81721a9 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 1405d07e..94fdf4ac 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 a752b330..bd23867e 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
index a6d1c1cb..a6d1c1cb 100644
--- a/test/label_test.config
+++ b/test/label_test.rules
diff --git a/test/modifier_test.config b/test/modifier_test.rules
index f63e02c3..f63e02c3 100644
--- a/test/modifier_test.config
+++ b/test/modifier_test.rules
diff --git a/test/replace_test.config b/test/replace_test.rules
index 8fbfd181..8fbfd181 100644
--- a/test/replace_test.config
+++ b/test/replace_test.rules
diff --git a/test/topo_test.config b/test/topo_test.rules
index 72f03ee0..72f03ee0 100644
--- a/test/topo_test.config
+++ b/test/topo_test.rules
diff --git a/udev.c b/udev.c
index 094905ec..272afbab 100644
--- a/udev.c
+++ b/udev.c
@@ -27,6 +27,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <ctype.h>
#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 00000000..aadaea8a
--- /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 0c1951ad..4acbb613 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
index 44fdb256..44fdb256 100644
--- a/udev.config
+++ b/udev.rules
diff --git a/udev.config.demo b/udev.rules.demo
index 6426ce20..6426ce20 100644
--- a/udev.config.demo
+++ b/udev.rules.demo
diff --git a/udev.spec b/udev.spec
index 0c30d613..8cc424ca 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 <greg@kroah.com>
+- changes due to config file name changes
+
* Fri Oct 17 2003 Robert Love <rml@tech9.net>
- 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 00000000..262108df
--- /dev/null
+++ b/udev_config.c
@@ -0,0 +1,195 @@
+/*
+ * udev_config.c
+ *
+ * Userspace devfs
+ *
+ * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
+ *
+ *
+ * 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 <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <ctype.h>
+
+#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();
+}
+
+