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

Contents of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (show annotations)
Fri Sep 27 23:40:29 2002 UTC (21 years, 6 months ago) by nmav
Branch: MAIN
Changes since 1.8: +8 -1 lines
File MIME type: text/plain
Improvements on HIC support.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26