/[hydra]/hydra/src/config.c
ViewVC logotype

Contents of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (show annotations)
Tue Sep 24 21:47:25 2002 UTC (21 years, 6 months ago) by nmav
Branch: MAIN
Changes since 1.2: +10 -4 lines
File MIME type: text/plain
cleaned up the new virtual hosting code.

1 /*
2 * Boa, an http server
3 * Copyright (C) 1999 Larry Doolittle <ldoolitt@boa.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 1, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 */
20
21 /* $Id: config.c,v 1.2 2002/09/24 17:12:47 nmav Exp $*/
22
23 #include "boa.h"
24 #include "y.tab.h"
25 #include "parse.h"
26
27 int yyparse(void); /* Better match the output of lex */
28
29 #ifdef DEBUG
30 #define DBG(x) x
31 #else
32 #define DBG(x)
33 #endif
34
35 int server_port;
36 uid_t server_uid;
37 gid_t server_gid;
38 char *server_root;
39 char *server_name;
40 char *server_admin;
41 char *server_ip;
42 long int max_connections;
43
44 int server_max_threads = 1;
45
46 char *server_cert;
47 char *server_key;
48 int ssl_session_cache;
49 int boa_ssl = 0;
50 int ssl_port = 443;
51 int ssl_dh_bits = 1024; /* default value */
52 int ssl_session_timeout = 3600;
53 int ssl_params_refresh = 432000; /* every 5 days */
54
55 char *ssl_ciphers = NULL;
56 char *ssl_mac = NULL;
57 char *ssl_kx = NULL;
58 char *ssl_comp = NULL;
59 char *ssl_protocol = NULL;
60
61 char *default_document_root;
62 int default_document_root_size;
63
64 char *directory_index;
65 char *default_type;
66 char *dirmaker;
67 char *cachedir;
68
69 char *tempdir;
70
71 char *cgi_path = NULL;
72 int single_post_limit = SINGLE_POST_LIMIT_DEFAULT;
73
74 int ka_timeout;
75 int ka_max;
76
77 /* These came from log.c */
78 char *error_log_name;
79 char *access_log_name;
80 char *cgi_log_name;
81
82 int use_localtime;
83
84 /* These are new */
85 static void c_set_user(char *v1, char* v2, char* v3, char* v4, void *t);
86 static void c_set_group(char *v1, char* v2, char* v3, char* v4, void *t);
87 static void c_set_string(char *v1, char* v2, char* v3, char* v4, void *t);
88 static void c_set_int(char *v1, char* v2, char* v3, char* v4, void *t);
89 static void c_set_unity(char *v1, char* v2, char* v3, char* v4, void *t);
90 static void c_add_type(char *v1, char* v2, char* v3, char* v4, void *t);
91 static void c_add_vhost(char *v1, char* v2, char* v3, char*v4, void *t);
92 static void c_add_alias(char *v1, char* v2, char* v3, char* v4, void *t);
93
94 /* Fakery to keep the value passed to action() a void *,
95 see usage in table and c_add_alias() below */
96 static int script_number = SCRIPTALIAS;
97 static int redirect_number = REDIRECT;
98 static int alias_number = ALIAS;
99 static uid_t current_uid=0;
100
101 /* Help keep the table below compact */
102 #define S0A STMT_NO_ARGS
103 #define S1A STMT_ONE_ARG
104 #define S2A STMT_TWO_ARGS
105 #define S4A STMT_FOUR_ARGS
106
107 struct ccommand clist[] = {
108 {"SSLCiphers", S1A, c_set_string, &ssl_ciphers},
109 {"SSLKeyExchangeAlgorithms", S1A, c_set_string, &ssl_kx},
110 {"SSLMACAlgorithms", S1A, c_set_string, &ssl_mac},
111 {"SSLProtocols", S1A, c_set_string, &ssl_protocol},
112 {"SSLCompressionMethods", S1A, c_set_string, &ssl_comp},
113 {"SSLCertificate", S1A, c_set_string, &server_cert},
114 {"SSLKey", S1A, c_set_string, &server_key},
115 {"SSLSessionCache", S1A, c_set_int, &ssl_session_cache},
116 {"SSL", S1A, c_set_int, &boa_ssl},
117 {"SSLPort", S1A, c_set_int, &ssl_port},
118 {"SSLDHBits", S1A, c_set_int, &ssl_dh_bits},
119 {"SSLSessionTimeout", S1A, c_set_int, &ssl_session_timeout},
120 {"SSLParamsRefresh", S1A, c_set_int, &ssl_params_refresh},
121 {"Threads", S1A, c_set_int, &server_max_threads},
122 {"Port", S1A, c_set_int, &server_port},
123 {"Listen", S1A, c_set_string, &server_ip},
124 {"BackLog", S1A, c_set_int, &backlog},
125 {"User", S1A, c_set_user, NULL},
126 {"Group", S1A, c_set_group, NULL},
127 {"ServerAdmin", S1A, c_set_string, &server_admin},
128 {"ServerRoot", S1A, c_set_string, &server_root},
129 {"ErrorLog", S1A, c_set_string, &error_log_name},
130 {"AccessLog", S1A, c_set_string, &access_log_name},
131 {"UseLocaltime", S0A, c_set_unity, &use_localtime},
132 {"CgiLog", S1A, c_set_string, &cgi_log_name},
133 {"VerboseCGILogs", S0A, c_set_unity, &verbose_cgi_logs},
134 {"ServerName", S1A, c_set_string, &server_name},
135 {"DocumentRoot", S1A, c_set_string, &default_document_root},
136 {"DirectoryIndex", S1A, c_set_string, &directory_index},
137 {"DirectoryMaker", S1A, c_set_string, &dirmaker},
138 {"DirectoryCache", S1A, c_set_string, &cachedir},
139 {"KeepAliveMax", S1A, c_set_int, &ka_max},
140 {"KeepAliveTimeout", S1A, c_set_int, &ka_timeout},
141 {"MimeTypes", S1A, c_set_string, &mime_types},
142 {"DefaultType", S1A, c_set_string, &default_type},
143 {"AddType", S2A, c_add_type, NULL},
144 {"ScriptAlias", S2A, c_add_alias, &script_number},
145 {"Redirect", S2A, c_add_alias, &redirect_number},
146 {"Alias", S2A, c_add_alias, &alias_number},
147 /* HOST - IP - DOCUMENT_ROOT - USER_DIR */
148 {"VirtualHost", S4A, c_add_vhost, NULL},
149 {"SinglePostLimit", S1A, c_set_int, &single_post_limit},
150 {"CGIPath", S1A, c_set_string, &cgi_path},
151 {"MaxConnections", S1A, c_set_int, &max_connections},
152 };
153
154 static void c_set_user(char *v1, char* v2, char* v3, char* v4, void *t)
155 {
156 struct passwd *passwdbuf;
157 char *endptr;
158 int i;
159
160 DBG(printf("User %s = ", v1);
161 )
162 i = strtol(v1, &endptr, 0);
163 if (*v1 != '\0' && *endptr == '\0') {
164 server_uid = i;
165 } else {
166 passwdbuf = getpwnam(v1);
167 if (!passwdbuf) {
168 if (current_uid)
169 return;
170 fprintf(stderr, "No such user: %s\n", v1);
171 exit(1);
172 }
173 server_uid = passwdbuf->pw_uid;
174 }
175 DBG(printf("%d\n", server_uid);
176 )
177 }
178
179 static void c_set_group(char *v1, char* v2, char* v3, char* v4, void *t)
180 {
181 struct group *groupbuf;
182 char *endptr;
183 int i;
184 DBG(printf("Group %s = ", v1);
185 )
186 i = strtol(v1, &endptr, 0);
187 if (*v1 != '\0' && *endptr == '\0') {
188 server_gid = i;
189 } else {
190 groupbuf = getgrnam(v1);
191 if (!groupbuf) {
192 if (current_uid)
193 return;
194 fprintf(stderr, "No such group: %s\n", v1);
195 exit(1);
196 }
197 server_gid = groupbuf->gr_gid;
198 }
199 DBG(printf("%d\n", server_gid);
200 )
201 }
202
203 static void c_set_string(char *v1, char* v2, char* v3, char* v4, void *t)
204 {
205 char *s;
206 DBG(printf("Setting pointer %p to string %s ..", t, v1);
207 )
208 if (t) {
209 s = *(char **) t;
210 if (s)
211 free(s);
212 *(char **) t = strdup(v1);
213 if (!*(char **) t) {
214 DIE("Unable to strdup in c_set_string");
215 }
216 DBG(printf("done.\n");
217 )
218 } else {
219 DBG(printf("skipped.\n");
220 )
221 }
222 }
223
224 static void c_set_int(char *v1, char* v2, char* v3, char* v4, void *t)
225 {
226 char *endptr;
227 int i;
228 DBG(printf("Setting pointer %p to integer string %s ..", t, v1);
229 )
230 if (t) {
231 i = strtol(v1, &endptr, 0); /* Automatic base 10/16/8 switching */
232 if (*v1 != '\0' && *endptr == '\0') {
233 *(int *) t = i;
234 DBG(printf(" Integer converted as %d, done\n", i);
235 )
236 } else {
237 /* XXX should tell line number to user */
238 fprintf(stderr, "Error: %s found where integer expected\n",
239 v1);
240 }
241 } else {
242 DBG(printf("skipped.\n");
243 )
244 }
245 }
246
247 static void c_set_unity(char *v1, char* v2, char* v3, char* v4, void *t)
248 {
249 DBG(printf("Setting pointer %p to unity\n", t);
250 )
251 if (t)
252 *(int *) t = 1;
253 }
254
255 static void c_add_type(char *v1, char* v2, char* v3, char* v4, void *t)
256 {
257 add_mime_type(v1, v2);
258 }
259
260 static void c_add_vhost(char *v1, char *v2, char* v3, char* v4, void *t)
261 {
262 add_virthost(v1, v2, v3, v4);
263 }
264
265
266 static void c_add_alias(char *v1, char *v2, char* v3, char* v4, void *t)
267 {
268 add_alias(v2, v1, *(int *) t);
269 }
270
271 struct ccommand *lookup_keyword(char *c)
272 {
273 struct ccommand *p;
274 DBG(printf("Checking string '%s' against keyword list\n", c);
275 )
276 for (p = clist;
277 p < clist + (sizeof (clist) / sizeof (struct ccommand)); p++) {
278 if (strcmp(c, p->name) == 0)
279 return p;
280 }
281 return NULL;
282 }
283
284 /*
285 * Name: read_config_files
286 *
287 * Description: Reads config files via yyparse, then makes sure that
288 * all required variables were set properly.
289 */
290 void read_config_files(void)
291 {
292 char *temp;
293 current_uid = getuid();
294 yyin = fopen("boa.conf", "r");
295
296 if (!yyin) {
297 fputs("Could not open boa.conf for reading.\n", stderr);
298 exit(1);
299 }
300 if (yyparse()) {
301 fputs("Error parsing config files, exiting\n", stderr);
302 exit(1);
303 }
304
305 if (!server_name) {
306 struct hostent *he;
307 char temp_name[100];
308
309 if (gethostname(temp_name, 100) == -1) {
310 perror("gethostname:");
311 exit(1);
312 }
313
314 he = gethostbyname(temp_name);
315 if (he == NULL) {
316 perror("gethostbyname:");
317 exit(1);
318 }
319
320 server_name = strdup(he->h_name);
321 if (server_name == NULL) {
322 perror("strdup:");
323 exit(1);
324 }
325 }
326 tempdir = getenv("TMP");
327 if (tempdir == NULL)
328 tempdir = "/tmp";
329
330 if (single_post_limit < 0) {
331 fprintf(stderr, "Invalid value for single_post_limit: %d\n",
332 single_post_limit);
333 exit(1);
334 }
335
336 if (default_document_root) {
337 temp = normalize_path(default_document_root);
338 free(default_document_root);
339 default_document_root = temp;
340 default_document_root_size = strlen( default_document_root);
341 if ( default_document_root_size > MAX_PATH_LENGTH) {
342 log_error_time();
343 fprintf(stderr, "DocumentRoot size is too long\n");
344 exit(1);
345 }
346 } else default_document_root_size = 0;
347
348 if (error_log_name) {
349 temp = normalize_path(error_log_name);
350 free(error_log_name);
351 error_log_name = temp;
352 }
353
354 if (access_log_name) {
355 temp = normalize_path(access_log_name);
356 free(access_log_name);
357 access_log_name = temp;
358 }
359
360 if (cgi_log_name) {
361 temp = normalize_path(cgi_log_name);
362 free(cgi_log_name);
363 cgi_log_name = temp;
364 }
365
366 if (dirmaker) {
367 temp = normalize_path(dirmaker);
368 free(dirmaker);
369 dirmaker = temp;
370 }
371
372 #if 0
373 if (mime_types) {
374 temp = normalize_path(mime_types);
375 free(mime_types);
376 mime_types = temp;
377 }
378 #endif
379 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26