]> git.ipfire.org Git - thirdparty/systemd.git/blame - udev_config.c
fold multiple consecutive whitespace chars into single '_'
[thirdparty/systemd.git] / udev_config.c
CommitLineData
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
39char sysfs_path[PATH_SIZE];
40char udev_root[PATH_SIZE];
63f61c5c 41char udev_config_filename[PATH_SIZE];
6b493a20
KS
42char udev_rules_filename[PATH_SIZE];
43int udev_log_priority;
821d0ec8 44int udev_run;
e8baccca 45
28ce66de
KS
46static 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
94static 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 171void 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 194
2796c47b
MI
195 env = getenv("UDEV_ROOT");
196 if (env) {
197 strlcpy(udev_root, env, sizeof(udev_root));
198 remove_trailing_chars(udev_root, '/');
199 }
200
6b493a20
KS
201 env = getenv("UDEV_LOG");
202 if (env)
203 udev_log_priority = log_priority(env);
204
9f8dfa19 205 dbg("sysfs_path='%s'", sysfs_path);
6b493a20 206 dbg("UDEV_CONFIG_FILE='%s'", udev_config_filename);
9f8dfa19 207 dbg("udev_root='%s'", udev_root);
6b493a20
KS
208 dbg("udev_rules='%s'", udev_rules_filename);
209 dbg("udev_log=%d", udev_log_priority);
e8baccca 210}