Kagera uHTTP Daemon
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. /**
  2. * @PROJECT Kagera uHTTP Daemon
  3. * @COPYRIGHT See COPYING in the top level directory
  4. * @FILE kuhttpd.h
  5. * @PURPOSE HTTP Server
  6. * @DEVELOPERS Rafal Kupiec <belliash@asiotec.eu.org>
  7. * Jef Poskanzer <jef@acme.com>
  8. */
  9. #ifndef __KUHTTPD_H
  10. #define __KUHTTPD_H
  11. #define STDIN_FILENO 0
  12. #define STDOUT_FILENO 1
  13. #define STDERR_FILENO 2
  14. #define SIZE_T_MAX 2147483647L
  15. #define ERR_DIR "errors"
  16. #define DEFAULT_HTTP_PORT 80
  17. #define DEFAULT_HTTPS_PORT 443
  18. #define DEFAULT_CERTFILE "kuhttpd.pem"
  19. #define DEFAULT_CHARSET "UTF-8"
  20. #define DEFAULT_LANGUAGE "english"
  21. #define DEFAULT_CGI_PATTERN "cgi-bin/**|**.cgi|**.sh"
  22. #define CGI_NICE 10
  23. #define CGI_PATH "/usr/local/bin:/usr/ucb:/bin:/usr/bin:/usr/local/sbin:/sbin:/usr/sbin"
  24. #define CGI_LD_LIBRARY_PATH "/usr/local/lib:/usr/lib:/lib"
  25. #define AUTH_FILE ".htpasswd"
  26. #define READ_TIMEOUT 60
  27. #define WRITE_TIMEOUT 300
  28. #define METHOD_UNKNOWN 0
  29. #define METHOD_GET 1
  30. #define METHOD_HEAD 2
  31. #define METHOD_POST 3
  32. #define SERVER_SOFTWARE "Kagera uHTTP Daemon 1.42"
  33. struct mime_entry {
  34. char* ext;
  35. size_t ext_len;
  36. char* val;
  37. size_t val_len;
  38. };
  39. typedef union {
  40. struct sockaddr sa;
  41. struct sockaddr_in sa_in;
  42. struct sockaddr_in6 sa_in6;
  43. struct sockaddr_storage sa_stor;
  44. } usockaddr;
  45. static int b64_decode_table[256] = {
  46. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  47. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  48. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
  49. 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
  50. -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
  51. 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
  52. -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
  53. 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1,
  54. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  55. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  56. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  57. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  58. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  59. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  60. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
  61. -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
  62. };
  63. static unsigned char allowDirectoryListing;
  64. static char* argv0;
  65. static char* data_dir;
  66. static char* certfile;
  67. static char* cgi_pattern;
  68. static char* charset;
  69. static char* language;
  70. static char* cipher;
  71. static char cwd[MAXPATHLEN];
  72. static int debug;
  73. static char* defaultPageFile;
  74. static char* defaultRealmName;
  75. static char* defaultRealmPasswordFile;
  76. static char* dir;
  77. static int do_ssl;
  78. static int got_hup;
  79. static char* hostname;
  80. static char hostname_buf[500];
  81. static int listen4_fd, listen6_fd;
  82. static int listen4s_fd, listen6s_fd;
  83. static char* local_pattern;
  84. static char* logfile;
  85. static FILE* logfp;
  86. static int max_age;
  87. static int no_empty_referers;
  88. static char* p3p;
  89. static char* pageNotFoundFile;
  90. static char* pidfile;
  91. static unsigned short port;
  92. static SSL_CTX* ssl_ctx;
  93. static unsigned short sslPort;
  94. static char* url_pattern;
  95. static char* user;
  96. static off_t bytes;
  97. static usockaddr client_addr;
  98. static int conn_fd;
  99. static char* file;
  100. static int method;
  101. static char* path;
  102. static char* pathinfo;
  103. static char* protocol;
  104. static char* query;
  105. static char* request;
  106. static size_t request_size, request_len, request_idx;
  107. struct stat sb;
  108. static SSL* ssl;
  109. static int status;
  110. static char* authorization;
  111. static size_t content_length;
  112. static char* content_type;
  113. static char* cookie;
  114. static char* host;
  115. static time_t if_modified_since;
  116. static char* referer;
  117. static char* remoteuser;
  118. static char* response;
  119. static size_t response_size, response_len;
  120. static char* useragent;
  121. static void add_headers(int s, char* title, char* extra_header, char* me, char* mt, off_t b, time_t mod);
  122. static void add_to_buf(char** bufP, size_t* bufsizeP, size_t* buflenP, char* str, size_t len);
  123. static void add_to_request(char* str, size_t len);
  124. static void add_to_response(char* str, size_t len);
  125. static void auth_check(char* dirname, int is_ssl);
  126. static int b64_decode(const char* str, unsigned char* space, int size);
  127. static char* build_env(char* fmt, char* arg);
  128. static void cgi_interpose_input(int wfd, int is_ssl);
  129. static void cgi_interpose_output(int rfd, int parse_headers, int is_ssl);
  130. static void check_referer(int is_ssl);
  131. static void clear_ndelay(int fd);
  132. extern char* crypt(const char* key, const char* setting);
  133. static void de_dotdot(char* file);
  134. static void do_cgi(int is_ssl, unsigned short port);
  135. static void do_dir(int is_ssl);
  136. static void do_file(int is_ssl, unsigned short conn_port);
  137. static void* e_malloc(size_t size);
  138. static void* e_realloc(void* optr, size_t size);
  139. static char* e_strdup(char* ostr);
  140. static const char* figure_mime(char* name, char* me, size_t me_size);
  141. static char* file_details(const char* dir, const char* name);
  142. static char* get_method_str(int m);
  143. static int get_pathinfo(void);
  144. static char* get_request_line(void);
  145. static void handle_read_timeout(int sig, int is_ssl);
  146. static void handle_read_timeout_sig(int sig);
  147. static void handle_request(int is_ssl, unsigned short conn_port);
  148. static void handle_sigchld(int sig);
  149. static void handle_sighup(int sig);
  150. static void handle_sigterm(int sig);
  151. static void handle_write_timeout(int sig);
  152. static int hexit(char c);
  153. static void init_mime(void);
  154. static int initialize_listen_socket(usockaddr* usaP);
  155. static void lookup_hostname(usockaddr* usa4P, usockaddr* usa4sP, size_t sa4_len, int* gotv4P, int* gotv4sP, usockaddr* usa6P, usockaddr* usa6sP, size_t sa6_len, int* gotv6P, int* gotv6sP);
  156. static char** make_argp(void);
  157. static char** make_envp(int is_sl, unsigned short port);
  158. static void make_log_entry(void);
  159. static char* ntoa(usockaddr* usaP);
  160. static ssize_t my_read(char* buf, size_t size, int is_ssl);
  161. static ssize_t my_write(char* buf, size_t size, int is_ssl);
  162. static void no_value_required(char* name, char* value);
  163. static void post_post_garbage_hack(int is_ssl);
  164. static void read_config(char* filename);
  165. static int really_check_referer(void);
  166. static void reopen_logfile(void);
  167. static void send_authenticate(char* realm, int is_ssl);
  168. static void send_error(int s, char* title, char* extra_header, char* text, int is_ssl);
  169. static void send_error_body(int s, char* title, char* text);
  170. static int send_error_file(char* filename);
  171. static void send_error_tail(void);
  172. static void send_redirect(char* extra_header, char* hostname, char* new_location, int is_ssl);
  173. static void send_response(int is_ssl);
  174. static void send_via_write(int fd, off_t size, int is_ssl);
  175. static void set_ndelay(int fd);
  176. static int sockaddr_check(usockaddr* usaP);
  177. static size_t sockaddr_len(usockaddr* usaP);
  178. static void start_request(void);
  179. static void start_response(void);
  180. static void strdecode(char* to, char* from);
  181. static void strencode(char* to, size_t tosize, const char* from);
  182. static void usage(void);
  183. static void value_required(char* name, char* value);
  184. #endif