4 * Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
5 * Copyright (C) 2004, 2005 Kay Sievers <kay.sievers@vrfy.org>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation version 2 of the License.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include "libsysfs/sysfs/libsysfs.h"
32 #include "udev_libc_wrapper.h"
34 #include "udev_utils.h"
35 #include "udev_version.h"
38 /* global variables */
39 char sysfs_path[PATH_SIZE];
40 char udev_root[PATH_SIZE];
41 char udev_config_filename[PATH_SIZE];
42 char udev_rules_filename[PATH_SIZE];
43 int udev_log_priority;
46 static int get_key(char **line, char **key, char **value)
56 while (isspace(linepos[0]))
63 if (linepos[0] == '\0')
65 if (isspace(linepos[0]))
67 if (linepos[0] == '=')
76 while (isspace(linepos[0]))
80 if (linepos[0] == '"')
86 temp = strchr(linepos, '"');
94 static int parse_config_file(void)
108 if (file_map(udev_config_filename, &buf, &bufsize) != 0) {
109 err("can't open '%s' as config file: %s", udev_config_filename, strerror(errno));
113 /* loop through the whole file */
116 while (cur < bufsize) {
117 count = buf_get_line(buf, bufsize, cur);
122 if (count >= sizeof(line)) {
123 err("line too long, conf line skipped %s, line %d", udev_config_filename, lineno);
127 /* eat the whitespace */
128 while ((count > 0) && isspace(bufline[0])) {
135 /* see if this is a comment */
136 if (bufline[0] == COMMENT_CHARACTER)
139 memcpy(line, bufline, count);
143 retval = get_key(&linepos, &variable, &value);
145 err("error parsing %s, line %d:%d", udev_config_filename, lineno, (int) (linepos-line));
149 if (strcasecmp(variable, "udev_root") == 0) {
150 strlcpy(udev_root, value, sizeof(udev_root));
151 remove_trailing_chars(udev_root, '/');
155 if (strcasecmp(variable, "udev_rules") == 0) {
156 strlcpy(udev_rules_filename, value, sizeof(udev_rules_filename));
157 remove_trailing_chars(udev_rules_filename, '/');
161 if (strcasecmp(variable, "udev_log") == 0) {
162 udev_log_priority = log_priority(value);
167 file_unmap(buf, bufsize);
171 void udev_init_config(void)
175 strcpy(udev_root, UDEV_ROOT);
176 strcpy(udev_config_filename, UDEV_CONFIG_FILE);
177 strcpy(udev_rules_filename, UDEV_RULES_FILE);
178 udev_log_priority = LOG_ERR;
180 sysfs_get_mnt_path(sysfs_path, sizeof(sysfs_path));
182 /* disable RUN key execution */
183 env = getenv("UDEV_RUN");
184 if (env && !string_is_true(env))
187 env = getenv("UDEV_CONFIG_FILE");
189 strlcpy(udev_config_filename, env, sizeof(udev_config_filename));
190 remove_trailing_chars(udev_config_filename, '/');
195 env = getenv("UDEV_ROOT");
197 strlcpy(udev_root, env, sizeof(udev_root));
198 remove_trailing_chars(udev_root, '/');
201 env = getenv("UDEV_LOG");
203 udev_log_priority = log_priority(env);
205 dbg("sysfs_path='%s'", sysfs_path);
206 dbg("UDEV_CONFIG_FILE='%s'", udev_config_filename);
207 dbg("udev_root='%s'", udev_root);
208 dbg("udev_rules='%s'", udev_rules_filename);
209 dbg("udev_log=%d", udev_log_priority);