1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-23 21:35:11 +03:00

[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.
This commit is contained in:
greg@kroah.com 2003-12-03 01:08:46 -08:00 committed by Greg KH
parent 29b82deb7e
commit e8bacccab2
15 changed files with 265 additions and 74 deletions

View File

@ -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)

View File

@ -606,7 +606,7 @@ int namedev_init(void)
{
int retval;
retval = namedev_init_config();
retval = namedev_init_rules();
if (retval)
return retval;

View File

@ -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

View File

@ -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;
}

60
udev.c
View File

@ -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");

23
udev.conf Normal file
View File

@ -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"

17
udev.h
View File

@ -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

View File

@ -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

195
udev_config.c Normal file
View File

@ -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();
}