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_db_path[PATH_SIZE];
42 char udev_config_filename[PATH_SIZE];
43 char udev_rules_filename[PATH_SIZE];
44 int udev_log_priority;
47 static int get_key(char **line, char **key, char **value)
57 while (isspace(linepos[0]))
64 if (linepos[0] == '\0')
66 if (isspace(linepos[0]))
68 if (linepos[0] == '=')
77 while (isspace(linepos[0]))
81 if (linepos[0] == '"')
87 temp = strchr(linepos, '"');
95 static int parse_config_file(void)
109 if (file_map(udev_config_filename, &buf, &bufsize) != 0) {
110 err("can't open '%s' as config file: %s", udev_config_filename, strerror(errno));
114 /* loop through the whole file */
117 while (cur < bufsize) {
118 count = buf_get_line(buf, bufsize, cur);
123 if (count >= sizeof(line)) {
124 err("line too long, conf line skipped %s, line %d", udev_config_filename, lineno);
128 /* eat the whitespace */
129 while ((count > 0) && isspace(bufline[0])) {
136 /* see if this is a comment */
137 if (bufline[0] == COMMENT_CHARACTER)
140 memcpy(line, bufline, count);
144 retval = get_key(&linepos, &variable, &value);
146 err("error parsing %s, line %d:%d", udev_config_filename, lineno, (int) (linepos-line));
150 if (strcasecmp(variable, "udev_root") == 0) {
151 strlcpy(udev_root, value, sizeof(udev_root));
152 remove_trailing_chars(udev_root, '/');
156 if (strcasecmp(variable, "udev_db") == 0) {
157 strlcpy(udev_db_path, value, sizeof(udev_db_path));
158 remove_trailing_chars(udev_db_path, '/');
162 if (strcasecmp(variable, "udev_rules") == 0) {
163 strlcpy(udev_rules_filename, value, sizeof(udev_rules_filename));
164 remove_trailing_chars(udev_rules_filename, '/');
168 if (strcasecmp(variable, "udev_log") == 0) {
169 udev_log_priority = log_priority(value);
174 file_unmap(buf, bufsize);
178 void udev_init_config(void)
182 strcpy(udev_root, UDEV_ROOT);
183 strcpy(udev_db_path, UDEV_DB);
184 strcpy(udev_config_filename, UDEV_CONFIG_FILE);
185 strcpy(udev_rules_filename, UDEV_RULES_FILE);
186 udev_log_priority = LOG_ERR;
188 sysfs_get_mnt_path(sysfs_path, sizeof(sysfs_path));
190 /* disable RUN key execution */
191 env = getenv("UDEV_RUN");
192 if (env && !string_is_true(env))
195 env = getenv("UDEV_CONFIG_FILE");
197 strlcpy(udev_config_filename, env, sizeof(udev_config_filename));
198 remove_trailing_chars(udev_config_filename, '/');
203 env = getenv("UDEV_LOG");
205 udev_log_priority = log_priority(env);
207 dbg("sysfs_path='%s'", sysfs_path);
208 dbg("UDEV_CONFIG_FILE='%s'", udev_config_filename);
209 dbg("udev_root='%s'", udev_root);
210 dbg("udev_db='%s'", udev_db_path);
211 dbg("udev_rules='%s'", udev_rules_filename);
212 dbg("udev_log=%d", udev_log_priority);