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

Contents of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.20 - (show annotations)
Wed Jan 22 07:51:50 2003 UTC (21 years, 2 months ago) by nmav
Branch: MAIN
CVS Tags: hydra_0_1_7, hydra_0_1_6, hydra_0_1_4
Changes since 1.19: +13 -1 lines
File MIME type: text/plain
merged changes from 0.1.x branch.

1 /*
2 * Hydra, 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.19.2.5 2003/01/19 10:15:22 nmav Exp $*/
22
23 #include "boa.h"
24 #include "boa_grammar.h"
25 #include "access.h"
26 #include "parse.h"
27
28 int yyparse(void); /* Better match the output of lex */
29
30 #ifdef DEBUG
31 #define DBG(x) x
32 #else
33 #define DBG(x)
34 #endif
35
36 int server_port;
37 uid_t server_uid;
38 gid_t server_gid;
39 char *server_root;
40 char *server_name;
41 char *server_admin;
42 char *server_ip;
43 long int max_connections;
44 long int max_ssl_connections;
45
46 char * default_charset = NULL;
47
48 int max_files_cache = 256;
49 int max_file_size_cache = 100 * 1024;
50
51 int max_server_threads = 1;
52 int max_hic_threads = 1;
53
54 char *server_cert;
55 char *server_key;
56 char *ca_cert = NULL;
57 int ssl_session_cache;
58 int ssl_verify = 0;
59 int boa_ssl = 0;
60 int ssl_port = 443;
61 int ssl_dh_bits = 1024; /* default value */
62 int ssl_session_timeout = 3600;
63 int maintenance_interval = 432000; /* every 5 days */
64
65 char *ssl_ciphers = NULL;
66 char *ssl_mac = NULL;
67 char *ssl_kx = NULL;
68 char *ssl_comp = NULL;
69 char *ssl_protocol = NULL;
70
71 char *default_type;
72 char *dirmaker;
73 char *cachedir;
74
75 char *tempdir;
76 int tempdir_len = 0;
77
78 char *cgi_path = NULL;
79 int cgi_umask = 027;
80 char *pid_file;
81
82 int single_post_limit = SINGLE_POST_LIMIT_DEFAULT;
83
84 int ka_timeout;
85 int ka_max;
86
87 /* These came from log.c */
88 char *error_log_name;
89 char *access_log_name;
90 char *cgi_log_name;
91
92 int use_localtime;
93
94 /* These are new */
95 static void c_set_user(char *v1, char* v2, char* v3, char* v4, void *t);
96 static void c_set_group(char *v1, char* v2, char* v3, char* v4, void *t);
97 static void c_set_string(char *v1, char* v2, char* v3, char* v4, void *t);
98 static void c_set_int(char *v1, char* v2, char* v3, char* v4, void *t);
99 static void c_set_longint(char *v1, char* v2, char* v3, char* v4, void *t);
100 static void c_set_unity(char *v1, char* v2, char* v3, char* v4, void *t);
101 static void c_add_type(char *v1, char* v2, char* v3, char* v4, void *t);
102 static void c_add_vhost(char *v1, char* v2, char* v3, char*v4, void *t);
103 static void c_set_documentroot(char *v1, char* v2, char* v3, char*v4, void *t);
104 static void c_add_alias(char *v1, char* v2, char* v3, char* v4, void *t);
105 static void c_add_dirindex(char *v1, char* v2, char* v3, char* v4, void *t);
106 static void c_add_hic_module(char *v1, char* v2, char* v3, char* v4, void *t);
107 static void c_add_hic_action(char *v1, char* v2, char* v3, char* v4, void *t);
108 #ifdef ENABLE_ACCESS_LISTS
109 static void c_add_access(char *v1, char *v2, char* v3, char* v4, void *t);
110 #endif
111
112 /* Fakery to keep the value passed to action() a void *,
113 see usage in table and c_add_alias() below */
114 static int script_number = SCRIPTALIAS;
115 static int redirect_number = REDIRECT;
116 static int alias_number = ALIAS;
117 static uid_t current_uid=0;
118
119 /* Help keep the table below compact */
120 #define S0A STMT_NO_ARGS
121 #define S1A STMT_ONE_ARG
122 #define S2A STMT_TWO_ARGS
123 #define S3A STMT_THREE_ARGS
124 #define S4A STMT_FOUR_ARGS
125
126 struct ccommand clist[] = {
127 {"SSLVerifyClient", S1A, c_set_int, &ssl_verify},
128 {"SSLCiphers", S1A, c_set_string, &ssl_ciphers},
129 {"SSLKeyExchangeAlgorithms", S1A, c_set_string, &ssl_kx},
130 {"SSLMACAlgorithms", S1A, c_set_string, &ssl_mac},
131 {"SSLProtocols", S1A, c_set_string, &ssl_protocol},
132 {"SSLCompressionMethods", S1A, c_set_string, &ssl_comp},
133 {"SSLCertificate", S1A, c_set_string, &server_cert},
134 {"SSLCAList", S1A, c_set_string, &ca_cert},
135 {"SSLKey", S1A, c_set_string, &server_key},
136 {"SSLSessionCache", S1A, c_set_int, &ssl_session_cache},
137 {"SSL", S1A, c_set_int, &boa_ssl},
138 {"SSLPort", S1A, c_set_int, &ssl_port},
139 {"SSLDHBits", S1A, c_set_int, &ssl_dh_bits},
140 {"SSLSessionTimeout", S1A, c_set_int, &ssl_session_timeout},
141 {"MaintenanceInterval", S1A, c_set_int, &maintenance_interval},
142 {"Threads", S1A, c_set_int, &max_server_threads},
143 {"HICThreads", S1A, c_set_int, &max_hic_threads},
144 {"Port", S1A, c_set_int, &server_port},
145 {"Listen", S1A, c_set_string, &server_ip},
146 {"BackLog", S1A, c_set_int, &backlog},
147 {"User", S1A, c_set_user, NULL},
148 {"Group", S1A, c_set_group, NULL},
149 {"ServerAdmin", S1A, c_set_string, &server_admin},
150 {"ServerRoot", S1A, c_set_string, &server_root},
151 {"ErrorLog", S1A, c_set_string, &error_log_name},
152 {"AccessLog", S1A, c_set_string, &access_log_name},
153 {"UseLocaltime", S0A, c_set_unity, &use_localtime},
154 {"CgiLog", S1A, c_set_string, &cgi_log_name},
155 {"VerboseCGILogs", S0A, c_set_unity, &verbose_cgi_logs},
156 {"ServerName", S1A, c_set_string, &server_name},
157 {"DocumentRoot", S1A, c_set_documentroot, NULL},
158 {"DirectoryIndex", S1A, c_add_dirindex, NULL},
159 {"DirectoryMaker", S1A, c_set_string, &dirmaker},
160 {"DirectoryCache", S1A, c_set_string, &cachedir},
161 {"KeepAliveMax", S1A, c_set_int, &ka_max},
162 {"KeepAliveTimeout", S1A, c_set_int, &ka_timeout},
163 {"MimeTypes", S1A, c_set_string, &mime_types},
164 {"DefaultType", S1A, c_set_string, &default_type},
165 {"DefaultCharset", S1A, c_set_string, &default_charset},
166 {"AddType", S2A, c_add_type, NULL},
167 {"HICModule", S3A, c_add_hic_module, NULL},
168 {"CGIAction", S2A, c_add_hic_action, NULL},
169 {"ScriptAlias", S3A, c_add_alias, &script_number},
170 {"Redirect", S3A, c_add_alias, &redirect_number},
171 {"Alias", S3A, c_add_alias, &alias_number},
172 {"PidFile", S1A, c_set_string, &pid_file},
173 {"CGIumask", S1A, c_set_int, &cgi_umask},
174 {"CGILog", S1A, c_set_string, &cgi_log_name},
175 /* HOST - IP - DOCUMENT_ROOT - USER_DIR */
176 {"VirtualHost", S4A, c_add_vhost, NULL},
177 {"SinglePostLimit", S1A, c_set_int, &single_post_limit},
178 {"CGIPath", S1A, c_set_string, &cgi_path},
179 {"MaxSSLConnections", S1A, c_set_longint, &max_ssl_connections},
180 {"MaxConnections", S1A, c_set_longint, &max_connections},
181 {"MaxFilesCache", S1A, c_set_int, &max_files_cache},
182 {"MaxFileSizeCache", S1A, c_set_int, &max_file_size_cache},
183 #ifdef ENABLE_ACCESS_LISTS
184 {"Allow", S2A, c_add_access, (void*)ACCESS_ALLOW},
185 {"Deny", S2A, c_add_access, (void*)ACCESS_DENY},
186 #endif
187 };
188
189 static void c_set_user(char *v1, char* v2, char* v3, char* v4, void *t)
190 {
191 struct passwd *passwdbuf;
192 char *endptr;
193 int i;
194
195 DBG(printf("User %s = ", v1);
196 )
197 i = strtol(v1, &endptr, 0);
198 if (*v1 != '\0' && *endptr == '\0') {
199 server_uid = i;
200 } else {
201 passwdbuf = getpwnam(v1);
202 if (!passwdbuf) {
203 if (current_uid)
204 return;
205 fprintf(stderr, "No such user: %s\n", v1);
206 exit(1);
207 }
208 server_uid = passwdbuf->pw_uid;
209 }
210 DBG(printf("%d\n", server_uid);
211 )
212 }
213
214 static void c_set_group(char *v1, char* v2, char* v3, char* v4, void *t)
215 {
216 struct group *groupbuf;
217 char *endptr;
218 int i;
219 DBG(printf("Group %s = ", v1);
220 )
221 i = strtol(v1, &endptr, 0);
222 if (*v1 != '\0' && *endptr == '\0') {
223 server_gid = i;
224 } else {
225 groupbuf = getgrnam(v1);
226 if (!groupbuf) {
227 if (current_uid)
228 return;
229 fprintf(stderr, "No such group: %s\n", v1);
230 exit(1);
231 }
232 server_gid = groupbuf->gr_gid;
233 }
234 DBG(printf("%d\n", server_gid);
235 )
236 }
237
238 static void c_set_string(char *v1, char* v2, char* v3, char* v4, void *t)
239 {
240 char *s;
241 DBG(printf("Setting pointer %p to string %s ..", t, v1);
242 )
243 if (t) {
244 s = *(char **) t;
245 if (s)
246 free(s);
247 *(char **) t = strdup(v1);
248 if (!*(char **) t) {
249 DIE("Unable to strdup in c_set_string");
250 }
251 DBG(printf("done.\n");
252 )
253 } else {
254 DBG(printf("skipped.\n");
255 )
256 }
257 }
258
259 static void c_set_documentroot(char *v1, char* v2, char* v3, char* v4, void *t)
260 {
261 /* Add the "", which is the default virtual host */
262 add_virthost("", "*", v1, "");
263 }
264
265 static void c_set_int(char *v1, char* v2, char* v3, char* v4, void *t)
266 {
267 char *endptr;
268 int i;
269 DBG(printf("Setting pointer %p to integer string %s ..", t, v1);
270 )
271 if (t) {
272 i = strtol(v1, &endptr, 0); /* Automatic base 10/16/8 switching */
273 if (*v1 != '\0' && *endptr == '\0') {
274 *(int *) t = i;
275 DBG(printf(" Integer converted as %d, done\n", i);
276 )
277 } else {
278 /* XXX should tell line number to user */
279 fprintf(stderr, "Error: %s found where integer expected\n",
280 v1);
281 }
282 } else {
283 DBG(printf("skipped.\n");
284 )
285 }
286 }
287
288 static void c_set_longint(char *v1, char* v2, char* v3, char* v4, void *t)
289 {
290 char *endptr;
291 int i;
292 DBG(printf("Setting pointer %p to long integer string %s ..", t, v1);
293 )
294 if (t) {
295 i = strtol(v1, &endptr, 0); /* Automatic base 10/16/8 switching */
296 if (*v1 != '\0' && *endptr == '\0') {
297 *(long int *) t = i;
298 DBG(printf(" Integer converted as %d, done\n", i);
299 )
300 } else {
301 /* XXX should tell line number to user */
302 fprintf(stderr, "Error: %s found where integer expected\n",
303 v1);
304 }
305 } else {
306 DBG(printf("skipped.\n");
307 )
308 }
309 }
310
311 static void c_set_unity(char *v1, char* v2, char* v3, char* v4, void *t)
312 {
313 DBG(printf("Setting pointer %p to unity\n", t);
314 )
315 if (t)
316 *(int *) t = 1;
317 }
318
319 static void c_add_type(char *v1, char* v2, char* v3, char* v4, void *t)
320 {
321 add_mime_type(v2, v1);
322 }
323
324 static void c_add_hic_module(char *v1, char* v2, char* v3, char* v4, void *t)
325 {
326 add_hic_module(v1, v2, v3);
327 }
328
329 static void c_add_hic_action(char *v1, char* v2, char* v3, char* v4, void *t)
330 {
331 add_hic_action(v1, v2);
332 }
333
334 static void c_add_dirindex(char *v1, char* v2, char* v3, char* v4, void *t)
335 {
336 add_directory_index(v1);
337 }
338
339 static void c_add_vhost(char *v1, char *v2, char* v3, char* v4, void *t)
340 {
341 add_virthost(v1, v2, v3, v4);
342 }
343
344
345 static void c_add_alias(char *v1, char *v2, char* v3, char* v4, void *t)
346 {
347 add_alias(v1, v2, v3, *(int *) t);
348 }
349
350 struct ccommand *lookup_keyword(char *c)
351 {
352 struct ccommand *p;
353 DBG(printf("Checking string '%s' against keyword list\n", c);
354 )
355 for (p = clist;
356 p < clist + (sizeof (clist) / sizeof (struct ccommand)); p++) {
357 if (strcmp(c, p->name) == 0)
358 return p;
359 }
360 return NULL;
361 }
362
363 /*
364 * Name: read_config_files
365 *
366 * Description: Reads config files via yyparse, then makes sure that
367 * all required variables were set properly.
368 */
369 void read_config_files(void)
370 {
371 current_uid = getuid();
372 yyin = fopen("hydra.conf", "r");
373
374 if (!yyin) {
375 fputs("Could not open hydra.conf for reading.\n", stderr);
376 exit(1);
377 }
378 if (yyparse()) {
379 fputs("Error parsing config files, exiting\n", stderr);
380 exit(1);
381 }
382
383 if (!server_name) {
384 struct hostent *he;
385 char temp_name[100];
386
387 if (gethostname(temp_name, 100) == -1) {
388 perror("gethostname:");
389 exit(1);
390 }
391
392 he = gethostbyname(temp_name);
393 if (he == NULL) {
394 perror("gethostbyname:");
395 exit(1);
396 }
397
398 server_name = strdup(he->h_name);
399 if (server_name == NULL) {
400 perror("strdup:");
401 exit(1);
402 }
403 }
404 tempdir = getenv("TMPDIR");
405 if (tempdir == NULL)
406 tempdir = "/tmp";
407 tempdir_len = strlen( tempdir);
408
409 if (single_post_limit < 0) {
410 fprintf(stderr, "Invalid value for single_post_limit: %d\n",
411 single_post_limit);
412 exit(1);
413 }
414
415 }
416
417 #ifdef ENABLE_ACCESS_LISTS
418 static void c_add_access(char *v1, char *v2, char* v3, char* v4, void *t)
419 {
420 access_add(v1, v2, (int)t);
421 }
422 #endif

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26