]>
Commit | Line | Data |
---|---|---|
e8baccca GKH |
1 | /* |
2 | * udev_config.c | |
3 | * | |
274812b5 | 4 | * Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com> |
e8d569b4 | 5 | * Copyright (C) 2004, 2005 Kay Sievers <kay.sievers@vrfy.org> |
e8baccca GKH |
6 | * |
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. | |
10 | * | |
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. | |
15 | * | |
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. | |
19 | * | |
20 | */ | |
21 | ||
e8baccca GKH |
22 | #include <stdlib.h> |
23 | #include <string.h> | |
24 | #include <stdio.h> | |
25 | #include <fcntl.h> | |
26 | #include <unistd.h> | |
27 | #include <errno.h> | |
28 | #include <ctype.h> | |
6b493a20 | 29 | #include <syslog.h> |
e8baccca | 30 | |
c80da508 | 31 | #include "libsysfs/sysfs/libsysfs.h" |
63f61c5c | 32 | #include "udev_libc_wrapper.h" |
e8baccca | 33 | #include "udev.h" |
9af5bb2f | 34 | #include "udev_utils.h" |
e8baccca | 35 | #include "udev_version.h" |
54988802 | 36 | #include "logging.h" |
e8baccca GKH |
37 | |
38 | /* global variables */ | |
63f61c5c KS |
39 | char sysfs_path[PATH_SIZE]; |
40 | char udev_root[PATH_SIZE]; | |
63f61c5c | 41 | char udev_config_filename[PATH_SIZE]; |
6b493a20 KS |
42 | char udev_rules_filename[PATH_SIZE]; |
43 | int udev_log_priority; | |
821d0ec8 | 44 | int udev_run; |
e8baccca | 45 | |
28ce66de KS |
46 | static int get_key(char **line, char **key, char **value) |
47 | { | |
48 | char *linepos; | |
49 | char *temp; | |
50 | ||
51 | linepos = *line; | |
52 | if (!linepos) | |
53 | return -1; | |
54 | ||
55 | /* skip whitespace */ | |
56 | while (isspace(linepos[0])) | |
57 | linepos++; | |
58 | ||
59 | /* get the key */ | |
60 | *key = linepos; | |
61 | while (1) { | |
62 | linepos++; | |
63 | if (linepos[0] == '\0') | |
64 | return -1; | |
65 | if (isspace(linepos[0])) | |
66 | break; | |
67 | if (linepos[0] == '=') | |
68 | break; | |
69 | } | |
70 | ||
71 | /* terminate key */ | |
72 | linepos[0] = '\0'; | |
73 | linepos++; | |
74 | ||
75 | /* skip whitespace */ | |
76 | while (isspace(linepos[0])) | |
77 | linepos++; | |
78 | ||
79 | /* get the value*/ | |
80 | if (linepos[0] == '"') | |
81 | linepos++; | |
82 | else | |
83 | return -1; | |
84 | *value = linepos; | |
85 | ||
86 | temp = strchr(linepos, '"'); | |
87 | if (!temp) | |
88 | return -1; | |
89 | temp[0] = '\0'; | |
90 | ||
91 | return 0; | |
92 | } | |
93 | ||
e8baccca GKH |
94 | static int parse_config_file(void) |
95 | { | |
3e441450 | 96 | char line[LINE_SIZE]; |
97 | char *bufline; | |
28ce66de | 98 | char *linepos; |
e8baccca GKH |
99 | char *variable; |
100 | char *value; | |
c81b35c0 KS |
101 | char *buf; |
102 | size_t bufsize; | |
103 | size_t cur; | |
104 | size_t count; | |
105 | int lineno; | |
e8baccca | 106 | int retval = 0; |
c81b35c0 | 107 | |
63f61c5c | 108 | if (file_map(udev_config_filename, &buf, &bufsize) != 0) { |
ff3e4bed | 109 | err("can't open '%s' as config file: %s", udev_config_filename, strerror(errno)); |
e8baccca GKH |
110 | return -ENODEV; |
111 | } | |
112 | ||
113 | /* loop through the whole file */ | |
c81b35c0 KS |
114 | lineno = 0; |
115 | cur = 0; | |
3e441450 | 116 | while (cur < bufsize) { |
c81b35c0 | 117 | count = buf_get_line(buf, bufsize, cur); |
3e441450 | 118 | bufline = &buf[cur]; |
c81b35c0 | 119 | cur += count+1; |
3e441450 | 120 | lineno++; |
e8baccca | 121 | |
63f61c5c | 122 | if (count >= sizeof(line)) { |
6b493a20 | 123 | err("line too long, conf line skipped %s, line %d", udev_config_filename, lineno); |
3e441450 | 124 | continue; |
125 | } | |
e8baccca | 126 | |
3e441450 | 127 | /* eat the whitespace */ |
3db7fa27 | 128 | while ((count > 0) && isspace(bufline[0])) { |
3e441450 | 129 | bufline++; |
130 | count--; | |
131 | } | |
3db7fa27 KS |
132 | if (count == 0) |
133 | continue; | |
3e441450 | 134 | |
e8baccca | 135 | /* see if this is a comment */ |
3e441450 | 136 | if (bufline[0] == COMMENT_CHARACTER) |
e8baccca GKH |
137 | continue; |
138 | ||
13d11705 KS |
139 | memcpy(line, bufline, count); |
140 | line[count] = '\0'; | |
3e441450 | 141 | |
28ce66de KS |
142 | linepos = line; |
143 | retval = get_key(&linepos, &variable, &value); | |
144 | if (retval != 0) { | |
6b493a20 | 145 | err("error parsing %s, line %d:%d", udev_config_filename, lineno, (int) (linepos-line)); |
28ce66de KS |
146 | continue; |
147 | } | |
aef6bb13 | 148 | |
aef6bb13 | 149 | if (strcasecmp(variable, "udev_root") == 0) { |
63f61c5c | 150 | strlcpy(udev_root, value, sizeof(udev_root)); |
b2c6818d | 151 | remove_trailing_chars(udev_root, '/'); |
aef6bb13 KS |
152 | continue; |
153 | } | |
154 | ||
aef6bb13 | 155 | if (strcasecmp(variable, "udev_rules") == 0) { |
63f61c5c | 156 | strlcpy(udev_rules_filename, value, sizeof(udev_rules_filename)); |
b2c6818d | 157 | remove_trailing_chars(udev_rules_filename, '/'); |
aef6bb13 KS |
158 | continue; |
159 | } | |
160 | ||
aef6bb13 | 161 | if (strcasecmp(variable, "udev_log") == 0) { |
6b493a20 | 162 | udev_log_priority = log_priority(value); |
aef6bb13 KS |
163 | continue; |
164 | } | |
e8baccca | 165 | } |
c81b35c0 KS |
166 | |
167 | file_unmap(buf, bufsize); | |
e8baccca GKH |
168 | return retval; |
169 | } | |
170 | ||
28ce66de | 171 | void udev_init_config(void) |
e8baccca | 172 | { |
6b493a20 | 173 | const char *env; |
e8baccca | 174 | |
6b493a20 | 175 | strcpy(udev_root, UDEV_ROOT); |
6b493a20 KS |
176 | strcpy(udev_config_filename, UDEV_CONFIG_FILE); |
177 | strcpy(udev_rules_filename, UDEV_RULES_FILE); | |
178 | udev_log_priority = LOG_ERR; | |
821d0ec8 | 179 | udev_run = 1; |
28ce66de | 180 | sysfs_get_mnt_path(sysfs_path, sizeof(sysfs_path)); |
e8baccca | 181 | |
821d0ec8 KS |
182 | /* disable RUN key execution */ |
183 | env = getenv("UDEV_RUN"); | |
184 | if (env && !string_is_true(env)) | |
185 | udev_run = 0; | |
186 | ||
6b493a20 KS |
187 | env = getenv("UDEV_CONFIG_FILE"); |
188 | if (env) { | |
189 | strlcpy(udev_config_filename, env, sizeof(udev_config_filename)); | |
b2c6818d | 190 | remove_trailing_chars(udev_config_filename, '/'); |
6b493a20 | 191 | } |
e8baccca | 192 | |
e8baccca | 193 | parse_config_file(); |
6b493a20 KS |
194 | |
195 | env = getenv("UDEV_LOG"); | |
196 | if (env) | |
197 | udev_log_priority = log_priority(env); | |
198 | ||
9f8dfa19 | 199 | dbg("sysfs_path='%s'", sysfs_path); |
6b493a20 | 200 | dbg("UDEV_CONFIG_FILE='%s'", udev_config_filename); |
9f8dfa19 | 201 | dbg("udev_root='%s'", udev_root); |
6b493a20 KS |
202 | dbg("udev_rules='%s'", udev_rules_filename); |
203 | dbg("udev_log=%d", udev_log_priority); | |
e8baccca | 204 | } |