1 /* $NetBSD: bozohttpd.h,v 1.14 2010/06/17 19:43:30 mrg Exp $ */ 2 3 /* $eterna: bozohttpd.h,v 1.35 2010/06/17 00:49:30 mrg Exp $ */ 4 5 /* 6 * Copyright (c) 1997-2010 Matthew R. Green 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer and 16 * dedication in the documentation and/or other materials provided 17 * with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 24 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 26 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 */ 32 33 #ifndef BOZOHTTOPD_H_ 34 #define BOZOHTTOPD_H_ 1 35 36 #include <sys/queue.h> 37 38 #include <sys/stat.h> 39 40 #include <stdio.h> 41 42 /* lots of "const" but gets free()'ed etc at times, sigh */ 43 44 /* headers */ 45 typedef struct bozoheaders { 46 /*const*/ char *h_header; 47 /*const*/ char *h_value; /* this gets free()'ed etc at times */ 48 SIMPLEQ_ENTRY(bozoheaders) h_next; 49 } bozoheaders_t; 50 51 typedef struct bozo_content_map_t { 52 const char *name; /* postfix of file */ 53 size_t namelen; /* length of postfix */ 54 const char *type; /* matching content-type */ 55 const char *encoding; /* matching content-encoding */ 56 const char *encoding11; /* matching content-encoding (HTTP/1.1) */ 57 const char *cgihandler; /* optional CGI handler */ 58 } bozo_content_map_t; 59 60 /* this struct holds the bozo constants */ 61 typedef struct bozo_consts_t { 62 const char *http_09; /* "HTTP/0.9" */ 63 const char *http_10; /* "HTTP/1.0" */ 64 const char *http_11; /* "HTTP/1.1" */ 65 const char *text_plain; /* "text/plain" */ 66 } bozo_consts_t; 67 68 /* this structure encapsulates all the bozo flags and control vars */ 69 typedef struct bozohttpd_t { 70 char *rootdir; /* root directory */ 71 char *username; /* username to switch to */ 72 int numeric; /* avoid gethostby*() */ 73 char *virtbase; /* virtual directory base */ 74 int unknown_slash; /* unknown vhosts go to normal slashdir */ 75 int untrustedref; /* make sure referrer = me unless url = / */ 76 int logstderr; /* log to stderr (even if not tty) */ 77 int background; /* drop into daemon mode */ 78 int foreground; /* keep daemon mode in foreground */ 79 size_t page_size; /* page size */ 80 char *slashdir; /* www slash directory */ 81 char *bindport; /* bind port; default "http" */ 82 char *bindaddress; /* address for binding - INADDR_ANY */ 83 int debug; /* debugging level */ 84 char *virthostname; /* my name */ 85 const char *server_software;/* our brand :-) */ 86 const char *index_html; /* our home page */ 87 const char *public_html; /* ~user/public_html page */ 88 int enable_users; /* enable public_html */ 89 int *sock; /* bound sockets */ 90 int nsock; /* number of above */ 91 struct pollfd *fds; /* current poll fd set */ 92 int request_times; /* # times a request was processed */ 93 int dir_indexing; /* handle directories */ 94 int hide_dots; /* hide .* */ 95 int process_cgi; /* use the cgi handler */ 96 char *cgibin; /* cgi-bin directory */ 97 void *sslinfo; /* pointer to ssl struct */ 98 int dynamic_content_map_size;/* size of dyn cont map */ 99 bozo_content_map_t *dynamic_content_map;/* dynamic content map */ 100 size_t mmapsz; /* size of region to mmap */ 101 char *getln_buffer; /* space for getln buffer */ 102 ssize_t getln_buflen; /* length of allocated space */ 103 char *errorbuf; /* no dynamic allocation allowed */ 104 bozo_consts_t consts; /* various constants */ 105 } bozohttpd_t; 106 107 /* bozo_httpreq_t */ 108 typedef struct bozo_httpreq_t { 109 bozohttpd_t *hr_httpd; 110 int hr_method; 111 #define HTTP_GET 0x01 112 #define HTTP_POST 0x02 113 #define HTTP_HEAD 0x03 114 #define HTTP_OPTIONS 0x04 /* not supported */ 115 #define HTTP_PUT 0x05 /* not supported */ 116 #define HTTP_DELETE 0x06 /* not supported */ 117 #define HTTP_TRACE 0x07 /* not supported */ 118 #define HTTP_CONNECT 0x08 /* not supported */ 119 const char *hr_methodstr; 120 char *hr_file; 121 char *hr_oldfile; /* if we added an index_html */ 122 char *hr_query; 123 const char *hr_proto; 124 const char *hr_content_type; 125 const char *hr_content_length; 126 const char *hr_allow; 127 const char *hr_host; /* HTTP/1.1 Host: */ 128 const char *hr_referrer; 129 const char *hr_range; 130 const char *hr_if_modified_since; 131 int hr_have_range; 132 off_t hr_first_byte_pos; 133 off_t hr_last_byte_pos; 134 /*const*/ char *hr_remotehost; 135 /*const*/ char *hr_remoteaddr; 136 /*const*/ char *hr_serverport; 137 #ifdef DO_HTPASSWD 138 /*const*/ char *hr_authrealm; 139 /*const*/ char *hr_authuser; 140 /*const*/ char *hr_authpass; 141 #endif 142 SIMPLEQ_HEAD(, bozoheaders) hr_headers; 143 int hr_nheaders; 144 } bozo_httpreq_t; 145 146 /* structure to hold string based (name, value) pairs with preferences */ 147 typedef struct bozoprefs_t { 148 unsigned size; /* size of the two arrays */ 149 unsigned c; /* # of entries in arrays */ 150 char **name; /* names of each entry */ 151 char **value; /* values for the name entries */ 152 } bozoprefs_t; 153 154 /* write in upto 64KiB chunks, and mmap in upto 64MiB chunks */ 155 #define BOZO_WRSZ (64 * 1024) 156 #define BOZO_MMAPSZ (BOZO_WRSZ * 1024) 157 158 /* debug flags */ 159 #define DEBUG_NORMAL 1 160 #define DEBUG_FAT 2 161 #define DEBUG_OBESE 3 162 #define DEBUG_EXPLODING 4 163 164 #define strornull(x) ((x) ? (x) : "<null>") 165 166 #ifdef DEBUG 167 void debug__(bozohttpd_t *, int, const char *, ...) 168 __attribute__((__format__(__printf__, 3, 4))); 169 #define debug(x) debug__ x 170 #else 171 #define debug(x) 172 #endif /* DEBUG */ 173 174 void bozo_warn(bozohttpd_t *, const char *, ...) 175 __attribute__((__format__(__printf__, 2, 3))); 176 void bozo_err(bozohttpd_t *, int, const char *, ...) 177 __attribute__((__format__(__printf__, 3, 4))) 178 __attribute__((__noreturn__)); 179 int bozo_http_error(bozohttpd_t *, int, bozo_httpreq_t *, const char *); 180 181 int bozo_check_special_files(bozo_httpreq_t *, const char *); 182 char *bozo_http_date(char *, size_t); 183 void bozo_print_header(bozo_httpreq_t *, struct stat *, const char *, const char *); 184 185 char *bozodgetln(bozohttpd_t *, int, ssize_t *, ssize_t (*)(bozohttpd_t *, int, void *, size_t)); 186 char *bozostrnsep(char **, const char *, ssize_t *); 187 188 void *bozomalloc(bozohttpd_t *, size_t); 189 void *bozorealloc(bozohttpd_t *, void *, size_t); 190 char *bozostrdup(bozohttpd_t *, const char *); 191 192 /* ssl-bozo.c */ 193 #ifdef NO_SSL_SUPPORT 194 #define bozo_ssl_set_opts(w, x, y) /* nothing */ 195 #define bozo_ssl_init(x) /* nothing */ 196 #define bozo_ssl_accept(x) /* nothing */ 197 #define bozo_ssl_destroy(x) /* nothing */ 198 #else 199 void bozo_ssl_set_opts(bozohttpd_t *, const char *, const char *); 200 void bozo_ssl_init(bozohttpd_t *); 201 void bozo_ssl_accept(bozohttpd_t *); 202 void bozo_ssl_destroy(bozohttpd_t *); 203 #endif 204 205 206 /* auth-bozo.c */ 207 #ifdef DO_HTPASSWD 208 int bozo_auth_check(bozo_httpreq_t *, const char *); 209 void bozo_auth_cleanup(bozo_httpreq_t *); 210 int bozo_auth_check_headers(bozo_httpreq_t *, char *, char *, ssize_t); 211 int bozo_auth_check_special_files(bozo_httpreq_t *, const char *); 212 void bozo_auth_check_401(bozo_httpreq_t *, int); 213 void bozo_auth_cgi_setenv(bozo_httpreq_t *, char ***); 214 int bozo_auth_cgi_count(bozo_httpreq_t *); 215 #else 216 #define bozo_auth_check(x, y) 0 217 #define bozo_auth_cleanup(x) /* nothing */ 218 #define bozo_auth_check_headers(y, z, a, b) 0 219 #define bozo_auth_check_special_files(x, y) 0 220 #define bozo_auth_check_401(x, y) /* nothing */ 221 #define bozo_auth_cgi_setenv(x, y) /* nothing */ 222 #define bozo_auth_cgi_count(x) 0 223 #endif /* DO_HTPASSWD */ 224 225 226 /* cgi-bozo.c */ 227 #ifdef NO_CGIBIN_SUPPORT 228 #define bozo_process_cgi(h) 0 229 #else 230 void bozo_cgi_setbin(bozohttpd_t *, const char *); 231 void bozo_setenv(bozohttpd_t *, const char *, const char *, char **); 232 int bozo_process_cgi(bozo_httpreq_t *); 233 void bozo_add_content_map_cgi(bozohttpd_t *, const char *, const char *); 234 #endif /* NO_CGIBIN_SUPPORT */ 235 236 237 /* daemon-bozo.c */ 238 #ifdef NO_DAEMON_MODE 239 #define bozo_daemon_init(x) /* nothing */ 240 #define bozo_daemon_fork(x) 0 241 #define bozo_daemon_closefds() /* nothing */ 242 #else 243 void bozo_daemon_init(bozohttpd_t *); 244 int bozo_daemon_fork(bozohttpd_t *); 245 void bozo_daemon_closefds(bozohttpd_t *); 246 #endif /* NO_DAEMON_MODE */ 247 248 249 /* tilde-luzah-bozo.c */ 250 #ifdef NO_USER_SUPPORT 251 #define bozo_user_transform(a, c) 0 252 #else 253 int bozo_user_transform(bozo_httpreq_t *, int *); 254 #endif /* NO_USER_SUPPORT */ 255 256 257 /* dir-index-bozo.c */ 258 #ifdef NO_DIRINDEX_SUPPORT 259 #define bozo_dir_index(a, b, c, d) 0 260 #else 261 int bozo_dir_index(bozo_httpreq_t *, const char *, int); 262 #endif /* NO_DIRINDEX_SUPPORT */ 263 264 265 /* content-bozo.c */ 266 const char *bozo_content_type(bozo_httpreq_t *, const char *); 267 const char *bozo_content_encoding(bozo_httpreq_t *, const char *); 268 bozo_content_map_t *bozo_match_content_map(bozohttpd_t *, const char *, int); 269 bozo_content_map_t *bozo_get_content_map(bozohttpd_t *, const char *); 270 #ifndef NO_DYNAMIC_CONTENT 271 void bozo_add_content_map_mime(bozohttpd_t *, const char *, const char *, const char *, const char *); 272 #endif 273 274 /* I/O */ 275 int bozo_printf(bozohttpd_t *, const char *, ...); 276 ssize_t bozo_read(bozohttpd_t *, int, void *, size_t); 277 ssize_t bozo_write(bozohttpd_t *, int, const void *, size_t); 278 int bozo_flush(bozohttpd_t *, FILE *); 279 280 /* misc */ 281 int bozo_init_httpd(bozohttpd_t *); 282 int bozo_init_prefs(bozoprefs_t *); 283 int bozo_set_defaults(bozohttpd_t *, bozoprefs_t *); 284 int bozo_setup(bozohttpd_t *, bozoprefs_t *, const char *, const char *); 285 bozo_httpreq_t *bozo_read_request(bozohttpd_t *); 286 void bozo_process_request(bozo_httpreq_t *); 287 void bozo_clean_request(bozo_httpreq_t *); 288 289 /* variables */ 290 int bozo_set_pref(bozoprefs_t *, const char *, const char *); 291 char *bozo_get_pref(bozoprefs_t *, const char *); 292 293 #endif /* BOZOHTTOPD_H_ */ 294