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

Contents of /hydra/src/hic_modules.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.6 - (show annotations)
Sat Sep 28 18:32:05 2002 UTC (21 years, 6 months ago) by nmav
Branch: MAIN
CVS Tags: hydra_0_0_8, hydra_0_0_9, hydra_0_0_3, hydra_0_0_6, hydra_0_0_7, hydra_0_0_4, hydra_0_0_5, hydra_0_1_1, hydra_0_1_0, hydra_0_0_10
Branch point for: hydra_0_1_0_patches
Changes since 1.5: +3 -3 lines
File MIME type: text/plain
corrected stuff which made compiling fail, if HIC was disabled.

1 /*
2 * Hydra, an http server
3 * Copyright (C) 2002 Nikos Mavroyanopoulos <nmav@gnutls.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: hic_modules.c,v 1.5 2002/09/28 17:49:13 nmav Exp $ */
22
23 /* This file includes support for dynamically loaded HIC modules
24 * All modules added to module_table[] will be dlopen()ed at startup.
25 *
26 * Also hic symbols will be resolved.
27 */
28
29 #include "boa.h"
30
31 #ifdef ENABLE_HIC
32 # include <dlfcn.h>
33 #endif
34
35 /* A dynamic module, must provide three functions:
36 * void _php_hic_shutdown(void);
37 * void _php_hic_init(void);
38 * off_t _php_hic_request(hic_stuff *hc);
39 *
40 * This is from php.
41 */
42
43
44 static hic_module_st* module_hashtable[MODULE_HASHTABLE_SIZE];
45
46 /*
47 * Name: add_module
48 *
49 * Description: add an module entry
50 */
51
52 void add_hic_module(const char *module, const char* sym_prefix, const char* content_type)
53 {
54 #ifndef ENABLE_HIC
55 fprintf(stderr, "Cannot open '%s' since dynamic module opening, is not supported, "
56 "or HIC has been disabled.\n", module);
57 #else
58 char symbol[128];
59 int hash;
60 hic_module_st* old, *start;
61
62 int sym_prefix_len;
63 void * handle;
64
65 /* sanity checking */
66 if (module == NULL || sym_prefix == NULL || content_type == NULL) {
67 DIE("NULL values sent to add_module");
68 }
69
70 hash = get_hic_module_hash_value( content_type);
71 start = old = module_hashtable[hash];
72
73 if ( old != NULL) {
74 /* find next empty */
75 do {
76 hash = (hash + 1) % MODULE_HASHTABLE_SIZE;
77
78 old = module_hashtable[hash];
79
80 if (start == old) {
81 DIE("Module hashtable is full.");
82 }
83
84 } while( old != NULL);
85 }
86
87 /* old was found, and is empty. */
88
89 old = malloc( sizeof(hic_module_st));
90 if (old==NULL) {
91 DIE("malloc() failed.");
92 }
93
94 old->sym_prefix = strdup( sym_prefix);
95 if (old->sym_prefix == NULL) {
96 DIE("strdup() failed.");
97 }
98
99 old->content_type = strdup( content_type);
100 if (old->content_type == NULL) {
101 DIE("strdup() failed.");
102 }
103
104 old->content_type_len = strlen( content_type);
105
106
107 handle = dlopen( module, RTLD_NOW);
108 if ( handle==NULL) {
109 fprintf(stderr, "Could not load module '%s'. Dlopen failed.\n", module);
110 exit(1);
111 }
112 old->dl_handle = handle;
113
114
115 sym_prefix_len = strlen( sym_prefix);
116 if (sym_prefix_len + 20 > sizeof(symbol)) {
117 DIE("Symbol prefix is too long.");
118 }
119
120 /* Resolve shutdown */
121 strcpy( symbol, sym_prefix);
122 strcat( symbol, "_hic_shutdown");
123
124 old->shutdown = dlsym( handle, symbol);
125 if ( old->shutdown == NULL) {
126 fprintf(stderr, "Could not resolve %s_hic_shutdown symbol", sym_prefix);
127 exit(1);
128 }
129
130 /* Resolve init */
131 strcpy( symbol, sym_prefix);
132 strcat( symbol, "_hic_init");
133
134 old->init = dlsym( handle, symbol);
135 if ( old->init == NULL) {
136 fprintf(stderr, "Could not resolve %s_hic_init symbol", sym_prefix);
137 exit(1);
138 }
139 old->init(); /* Run the initialization stuff */
140
141 /* Resolve request */
142 strcpy( symbol, sym_prefix);
143 strcat( symbol, "_hic_request");
144
145 old->request = dlsym( handle, symbol);
146 if ( old->request == NULL) {
147 fprintf(stderr, "Could not resolve %s_hic_request symbol", sym_prefix);
148 exit(1);
149 }
150
151 module_hashtable[hash] = old;
152
153 return;
154 #endif
155 }
156
157 /*
158 * Name: find_hic_appr_module
159 *
160 * Description: Locates the appropriate HIC module for the given file.
161 * Actually ones needs this to get the dlsymed() functions.
162 *
163 * Returns:
164 *
165 * a pointer to a hic_module_st structure or NULL if not found
166 */
167
168 hic_module_st *find_hic_appr_module(const char *content_type, int content_type_len)
169 {
170 int i, hash;
171
172 if (content_type == NULL) return NULL;
173 if (content_type_len == 0) content_type_len = strlen( content_type);
174
175 hash = get_hic_module_hash_value( content_type);
176 for (i=hash;i<MODULE_HASHTABLE_SIZE;i++) {
177 if (module_hashtable[i] == NULL) break;
178
179 if ( content_type_len != module_hashtable[i]->content_type_len) continue;
180
181 if (memcmp( content_type, module_hashtable[i]->content_type,
182 content_type_len) == 0) {
183 /* FOUND! */
184 return module_hashtable[i];
185 }
186 }
187
188 return NULL;
189
190 }
191
192
193 /*
194 * Empties the hic modules table, deallocating any allocated memory.
195 */
196
197 void dump_hic_modules(void)
198 {
199 #ifdef ENABLE_HIC
200 int i;
201
202 for (i = 0; i < MODULE_HASHTABLE_SIZE; ++i) { /* these limits OK? */
203 if (!module_hashtable[i]) continue;
204
205 free( module_hashtable[i]->sym_prefix);
206 free( module_hashtable[i]->content_type);
207 module_hashtable[i]->shutdown(); /* Run the deinitialization stuff */
208 dlclose( module_hashtable[i]->dl_handle);
209 free( module_hashtable[i]);
210 module_hashtable[i] = NULL;
211 }
212 #endif
213 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26