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.
33 /* global variables */
34 char udev_root[PATH_SIZE];
35 char udev_config_filename[PATH_SIZE];
36 char udev_rules_filename[PATH_SIZE];
37 int udev_log_priority;
40 static int get_key(char **line, char **key, char **value)
50 while (isspace(linepos[0]))
57 if (linepos[0] == '\0')
59 if (isspace(linepos[0]))
61 if (linepos[0] == '=')
70 while (isspace(linepos[0]))
74 if (linepos[0] == '"')
80 temp = strchr(linepos, '"');
88 static int parse_config_file(void)
102 if (file_map(udev_config_filename, &buf, &bufsize) != 0) {
103 err("can't open '%s' as config file: %s", udev_config_filename, strerror(errno));
107 /* loop through the whole file */
110 while (cur < bufsize) {
111 count = buf_get_line(buf, bufsize, cur);
116 if (count >= sizeof(line)) {
117 err("line too long, conf line skipped %s, line %d", udev_config_filename, lineno);
121 /* eat the whitespace */
122 while ((count > 0) && isspace(bufline[0])) {
129 /* see if this is a comment */
130 if (bufline[0] == COMMENT_CHARACTER)
133 memcpy(line, bufline, count);
137 retval = get_key(&linepos, &variable, &value);
139 err("error parsing %s, line %d:%d", udev_config_filename, lineno, (int)(linepos-line));
143 if (strcasecmp(variable, "udev_root") == 0) {
144 strlcpy(udev_root, value, sizeof(udev_root));
145 remove_trailing_chars(udev_root, '/');
149 if (strcasecmp(variable, "udev_rules") == 0) {
150 strlcpy(udev_rules_filename, value, sizeof(udev_rules_filename));
151 remove_trailing_chars(udev_rules_filename, '/');
155 if (strcasecmp(variable, "udev_log") == 0) {
156 udev_log_priority = log_priority(value);
161 file_unmap(buf, bufsize);
165 void udev_config_init(void)
169 strcpy(udev_root, UDEV_ROOT);
170 strcpy(udev_config_filename, UDEV_CONFIG_FILE);
171 strcpy(udev_rules_filename, UDEV_RULES_FILE);
172 udev_log_priority = LOG_ERR;
175 /* disable RUN key execution */
176 env = getenv("UDEV_RUN");
177 if (env && !string_is_true(env))
180 env = getenv("UDEV_CONFIG_FILE");
182 strlcpy(udev_config_filename, env, sizeof(udev_config_filename));
183 remove_trailing_chars(udev_config_filename, '/');
188 env = getenv("UDEV_ROOT");
190 strlcpy(udev_root, env, sizeof(udev_root));
191 remove_trailing_chars(udev_root, '/');
194 env = getenv("UDEV_LOG");
196 udev_log_priority = log_priority(env);
198 dbg("UDEV_CONFIG_FILE='%s'", udev_config_filename);
199 dbg("udev_root='%s'", udev_root);
200 dbg("udev_rules='%s'", udev_rules_filename);
201 dbg("udev_log=%d", udev_log_priority);