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.
libsysfs/dlist.o
OBJS = udev.o \
+ udev_config.o \
udev-add.o \
udev-remove.o \
udevdb.o \
$(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
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)
{
int retval;
- retval = namedev_init_config();
+ retval = namedev_init_rules();
if (retval)
return retval;
struct sysfs_class_device;
-#define COMMENT_CHARACTER '#'
enum config_type {
KERNEL_NAME = 0, /* must be 0 to let memset() default to this value */
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
#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;
}
}
-int namedev_init_config(void)
+int namedev_init_rules(void)
{
char line[255];
int lineno;
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;
}
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);
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;
}
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <ctype.h>
#include "udev.h"
#include "udev_version.h"
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)
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;
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");
--- /dev/null
+# 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"
+
__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
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
%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
--- /dev/null
+/*
+ * 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();
+}
+
+