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

Annotation of /hydra/src/config.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (hide annotations)
Tue Sep 24 17:12:47 2002 UTC (21 years, 6 months ago) by nmav
Branch: MAIN
Changes since 1.1: +31 -23 lines
File MIME type: text/plain
Added some support for host based virtual hosting.

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

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26