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

Contents of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.19 - (show annotations)
Fri Nov 1 18:56:15 2002 UTC (21 years, 5 months ago) by nmav
Branch: MAIN
CVS Tags: hydra_0_0_10, hydra_0_1_1, hydra_0_1_0
Branch point for: hydra_0_1_0_patches
Changes since 1.18: +2 -2 lines
File MIME type: text/plain
use the TMPDIR environment variable to get tmp directory.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26