1 |
/* |
2 |
* Boa, an http server |
3 |
* Copyright (C) 1995 Paul Phillips <paulp@go2net.com> |
4 |
* Some changes Copyright (C) 1996,97 Larry Doolittle <ldoolitt@jlab.org> |
5 |
* Some changes Copyright (C) 1997 Jon Nelson <jnelson@boa.org> |
6 |
* |
7 |
* This program is free software; you can redistribute it and/or modify |
8 |
* it under the terms of the GNU General Public License as published by |
9 |
* the Free Software Foundation; either version 1, or (at your option) |
10 |
* any later version. |
11 |
* |
12 |
* This program is distributed in the hope that it will be useful, |
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 |
* GNU General Public License for more details. |
16 |
* |
17 |
* You should have received a copy of the GNU General Public License |
18 |
* along with this program; if not, write to the Free Software |
19 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 |
* |
21 |
*/ |
22 |
|
23 |
/* $Id: globals.h,v 1.32 2003/01/22 07:51:50 nmav Exp $*/ |
24 |
|
25 |
#ifndef _GLOBALS_H |
26 |
#define _GLOBALS_H |
27 |
|
28 |
#ifdef ENABLE_SSL |
29 |
# include <gnutls/gnutls.h> |
30 |
#endif |
31 |
|
32 |
typedef struct { |
33 |
int socket; |
34 |
int secure; /* ssl or not. NOTE: 0 or 1. Nothing else. */ |
35 |
int port; |
36 |
int pending_requests; |
37 |
} socket_type; |
38 |
|
39 |
struct mmap_entry { |
40 |
dev_t dev; |
41 |
ino_t ino; |
42 |
char *mmap; |
43 |
int use_count; |
44 |
size_t len; |
45 |
int available; |
46 |
int times_used; |
47 |
}; |
48 |
|
49 |
/* This structure is used for both HIC loaded modules |
50 |
* and CGI Actions. |
51 |
*/ |
52 |
typedef struct { |
53 |
hic_shutdown_func shutdown; |
54 |
hic_init_func init; |
55 |
hic_request_func request; |
56 |
void *dl_handle; |
57 |
char* sym_prefix; /* ie. "_php" */ |
58 |
char* content_type; /* ie. "application/x-httpd-php" */ |
59 |
char* action; /* ie. "/usr/bin/php4" */ |
60 |
int content_type_len; |
61 |
} hic_module_st; |
62 |
|
63 |
struct alias { |
64 |
char *fakename; /* URI path to file */ |
65 |
char *realname; /* Actual path to file */ |
66 |
int type; /* ALIAS, SCRIPTALIAS, REDIRECT */ |
67 |
int fake_len; /* strlen of fakename */ |
68 |
int real_len; /* strlen of realname */ |
69 |
struct alias *next; |
70 |
}; |
71 |
|
72 |
typedef struct alias alias; |
73 |
|
74 |
typedef struct { |
75 |
/* We use this, in order to store data to pipes if the |
76 |
* given POST data length, is smaller that PIPE_BUF; |
77 |
*/ |
78 |
int fds[2]; /* 0 is for reading, 1 for writing */ |
79 |
int pipe; /* non zero if it's a pipe */ |
80 |
} tmp_fd; |
81 |
|
82 |
struct access_node |
83 |
{ |
84 |
char *pattern; |
85 |
char type; |
86 |
}; |
87 |
|
88 |
typedef struct _virthost { |
89 |
char *ip; /* This virthost will be visible in this IP */ |
90 |
char *host; /* The hostname of the virtual host */ |
91 |
char* document_root; /* The document root of this virtual host */ |
92 |
char* user_dir; /* The user dir of this virtual host */ |
93 |
int user_dir_len; /* strlen of user_dir */ |
94 |
int ip_len; /* strlen of IP */ |
95 |
int host_len; /* strlen of hostname */ |
96 |
int document_root_len; /* strlen of document root */ |
97 |
alias *alias_hashtable[ALIAS_HASHTABLE_SIZE]; /* aliases in this virthost */ |
98 |
|
99 |
int n_access; |
100 |
struct access_node *access_nodes; |
101 |
struct _virthost *next; |
102 |
} virthost; |
103 |
|
104 |
struct request { /* pending requests */ |
105 |
int fd; /* client's socket fd */ |
106 |
#ifdef USE_POLL |
107 |
int pollfd_id; |
108 |
#endif |
109 |
#ifdef ENABLE_SSL |
110 |
gnutls_session ssl_state; |
111 |
char * certificate_verified; /* a string that describes the output of the |
112 |
* certificate verification function. Needed |
113 |
* in CGIs. |
114 |
*/ |
115 |
#endif |
116 |
int secure; /* whether ssl or not */ |
117 |
int alert_to_send; /* in SEND_ALERT state */ |
118 |
|
119 |
int status; /* see #defines.h */ |
120 |
time_t time_last; /* time of last succ. op. */ |
121 |
char *pathname; /* pathname of requested file */ |
122 |
off_t range_start; /* send file from byte ... */ |
123 |
off_t range_stop; /* to byte */ |
124 |
off_t pipe_range_stop; /* This is used only if the file is sent by the pipe_read() method. |
125 |
* Indicates how many bytes to send from a file (actually a copy of range_stop, |
126 |
* but it is modified. */ |
127 |
int keepalive_given; /* whether the keepalive was sent by the client */ |
128 |
int keepalive; /* keepalive status */ |
129 |
int kacount; /* keepalive count */ |
130 |
|
131 |
int data_fd; /* fd of data */ |
132 |
off_t filesize; /* filesize */ |
133 |
off_t filepos; /* position in file */ |
134 |
char *data_mem; /* mmapped/malloced char array */ |
135 |
int method; /* M_GET, M_POST, etc. */ |
136 |
|
137 |
char *logline; /* line to log file */ |
138 |
|
139 |
char *header_line; /* beginning of un or incompletely processed header line */ |
140 |
char *header_end; /* last known end of header, or end of processed data */ |
141 |
int parse_pos; /* how much have we parsed */ |
142 |
int client_stream_pos; /* how much have we read... */ |
143 |
|
144 |
int buffer_start; /* where the buffer starts */ |
145 |
int buffer_end; /* where the buffer ends */ |
146 |
|
147 |
int http_version; /* HTTP version numeric HTTP_0_9, HTTP_1_0 etc */ |
148 |
char *http_version_str; /* HTTP/?.? of req */ |
149 |
int response_status; /* R_NOT_FOUND etc. */ |
150 |
|
151 |
char *if_modified_since; /* If-Modified-Since */ |
152 |
time_t last_modified; /* Last-modified: */ |
153 |
|
154 |
char *if_none_match_etag; |
155 |
char *if_match_etag; |
156 |
char *if_range_etag; /* These are the Etags sent by the client |
157 |
* In If-* requests. |
158 |
*/ |
159 |
int if_types; /* If-Match, If-None-Match, If-Range |
160 |
* and OR of the MATCH_* definitions. |
161 |
*/ |
162 |
|
163 |
char local_ip_addr[NI_MAXHOST]; /* for virtualhost */ |
164 |
int hostname_given; /* For HTTP/1.1 checks. 0 if the |
165 |
* Host header was not found. |
166 |
*/ |
167 |
char *hostname; /* The hostname used in this request */ |
168 |
char document_root[MAX_PATH_LENGTH + 1]; |
169 |
char user_dir[MAX_USER_DIR_LENGTH + 1]; |
170 |
|
171 |
/* CGI vars */ |
172 |
|
173 |
int remote_port; /* could be used for ident */ |
174 |
|
175 |
char remote_ip_addr[NI_MAXHOST]; /* after inet_ntoa */ |
176 |
|
177 |
char* action; /* the action to run if CGI_ACTION cgi */ |
178 |
int is_cgi; /* true if CGI/NPH */ |
179 |
int cgi_status; |
180 |
int cgi_env_index; /* index into array */ |
181 |
|
182 |
/* Agent and referer for logfiles */ |
183 |
char *header_user_agent; |
184 |
char *header_referer; |
185 |
|
186 |
tmp_fd post_data_fd; /* fd for post data tmpfile */ |
187 |
|
188 |
char *path_info; /* env variable */ |
189 |
char *path_translated; /* env variable */ |
190 |
char *script_name; /* env variable */ |
191 |
char *query_string; /* env variable */ |
192 |
char *content_type; /* env variable */ |
193 |
char *content_length; /* env variable */ |
194 |
|
195 |
struct mmap_entry *mmap_entry_var; |
196 |
|
197 |
struct request *next; /* next */ |
198 |
struct request *prev; /* previous */ |
199 |
|
200 |
/* everything below this line is kept regardless */ |
201 |
char buffer[BUFFER_SIZE + 1]; /* generic I/O buffer */ |
202 |
char request_uri[MAX_HEADER_LENGTH + 1]; /* uri */ |
203 |
char client_stream[CLIENT_STREAM_SIZE]; /* data from client - fit or be hosed */ |
204 |
char *cgi_env[CGI_ENV_MAX + 4]; /* CGI environment */ |
205 |
|
206 |
#ifdef ACCEPT_ON |
207 |
char accept[MAX_ACCEPT_LENGTH]; /* Accept: fields */ |
208 |
#endif |
209 |
}; |
210 |
|
211 |
typedef struct request request; |
212 |
|
213 |
struct status { |
214 |
long requests; |
215 |
long errors; |
216 |
}; |
217 |
|
218 |
|
219 |
extern char *optarg; /* For getopt */ |
220 |
extern FILE *yyin; /* yacc input */ |
221 |
|
222 |
typedef struct { |
223 |
#ifdef ENABLE_SMP |
224 |
pthread_t tid; |
225 |
#endif |
226 |
request* request_ready; |
227 |
request* request_block; |
228 |
request* request_free; |
229 |
|
230 |
socket_type server_s[2]; |
231 |
|
232 |
#ifdef USE_POLL |
233 |
struct pollfd *pfds; |
234 |
int pfd_len; |
235 |
#else |
236 |
fd_set block_read_fdset; /* fds blocked on read */ |
237 |
fd_set block_write_fdset; /* fds blocked on write */ |
238 |
#endif |
239 |
|
240 |
struct timeval req_timeout; |
241 |
int sighup_flag; /* 1 => signal has happened, needs attention */ |
242 |
int sigchld_flag; /* 1 => signal has happened, needs attention */ |
243 |
int sigalrm_flag; /* 1 => signal has happened, needs attention */ |
244 |
int sigusr1_flag; /* 1 => signal has happened, needs attention */ |
245 |
int sigterm_flag; /* lame duck mode */ |
246 |
|
247 |
int max_fd; |
248 |
|
249 |
int sockbufsize; |
250 |
struct status status; |
251 |
int total_connections; |
252 |
|
253 |
/* for SIGBUS handling */ |
254 |
jmp_buf env; |
255 |
int handle_sigbus; |
256 |
|
257 |
} server_params; |
258 |
|
259 |
/* HIC request stuff |
260 |
*/ |
261 |
typedef struct _hic_request { |
262 |
struct _hic_request *next; |
263 |
struct _hic_request *prev; |
264 |
hic_stuff command; |
265 |
} hic_request; |
266 |
|
267 |
/* parameters passed to a hic thread */ |
268 |
typedef struct { |
269 |
#ifdef ENABLE_SMP |
270 |
pthread_t tid; |
271 |
pthread_mutex_t lock; |
272 |
#endif |
273 |
int sigchld_flag; /* 1 => signal has happened, needs attention */ |
274 |
int sighup_flag; |
275 |
hic_request* request_head; |
276 |
} hic_params; |
277 |
|
278 |
/* global server variables */ |
279 |
|
280 |
extern int maintenance_interval; |
281 |
extern int mmap_list_entries_used; |
282 |
extern char *access_log_name; |
283 |
extern char *error_log_name; |
284 |
extern char *cgi_log_name; |
285 |
extern int cgi_log_fd; |
286 |
extern int use_localtime; |
287 |
|
288 |
extern int max_files_cache; |
289 |
extern int max_file_size_cache; |
290 |
|
291 |
extern int boa_ssl; |
292 |
|
293 |
extern int server_port; |
294 |
extern int ssl_port; |
295 |
extern uid_t server_uid; |
296 |
extern gid_t server_gid; |
297 |
extern char *server_admin; |
298 |
extern char *server_root; |
299 |
extern char *server_name; |
300 |
extern char *server_ip; |
301 |
extern int max_fd; |
302 |
|
303 |
extern char *default_type; |
304 |
extern char *default_charset; |
305 |
extern char *dirmaker; |
306 |
extern char *mime_types; |
307 |
extern char *pid_file; |
308 |
extern char *cachedir; |
309 |
|
310 |
extern char *default_document_root; |
311 |
extern int default_document_root_size; |
312 |
|
313 |
extern int system_bufsize; /* Default size of SNDBUF given by system */ |
314 |
|
315 |
extern char *tempdir; |
316 |
extern int tempdir_len; |
317 |
|
318 |
extern char *cgi_path; |
319 |
extern int single_post_limit; |
320 |
|
321 |
extern int ka_timeout; |
322 |
extern int ka_max; |
323 |
|
324 |
extern time_t start_time; |
325 |
|
326 |
extern int max_server_threads; |
327 |
extern int max_hic_threads; |
328 |
|
329 |
extern int cgi_umask; |
330 |
|
331 |
extern long int max_connections; |
332 |
extern long int max_ssl_connections; |
333 |
|
334 |
long int get_total_global_connections(int ssl); |
335 |
|
336 |
extern int verbose_cgi_logs; |
337 |
|
338 |
extern int backlog; |
339 |
extern time_t current_time; |
340 |
|
341 |
/* Global stuff that is shared by all threads. |
342 |
* Use with extreme care, or don't use. |
343 |
*/ |
344 |
extern server_params *global_server_params; |
345 |
extern int global_server_params_size; |
346 |
|
347 |
#ifdef ENABLE_HIC |
348 |
extern hic_params *global_hic_params; |
349 |
extern int global_hic_params_size; |
350 |
#endif |
351 |
|
352 |
/* The default character set used. |
353 |
*/ |
354 |
extern char *default_charset; |
355 |
|
356 |
/* These contain a string of the form: "Server: Hydra/0.0.x\r\n" |
357 |
*/ |
358 |
extern char boa_tls_version[]; |
359 |
extern char boa_version[]; |
360 |
|
361 |
#endif |