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

Annotation of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (hide annotations)
Sat Sep 28 17:49:13 2002 UTC (21 years, 6 months ago) by nmav
Branch: MAIN
CVS Tags: hydra_0_0_3
Changes since 1.10: +3 -1 lines
File MIME type: text/plain
*** empty log message ***

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26