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

Annotation of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations)
Wed Sep 25 06:42:34 2002 UTC (21 years, 6 months ago) by nmav
Branch: MAIN
Changes since 1.3: +6 -5 lines
File MIME type: text/plain
Cleanups. Added support for 3 argument options in the grammar (I'll probably rewrite it soon). Changed the Alias, ScriptAlias and Redirect options, to use the virtual hosting stuff.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26