UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2013 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef HTTPLISTENER_H 30 #define HTTPLISTENER_H 31 32 #include "sessionhandler.h" 33 #include "threadpools.h" 34 #include "config.h" 35 #include "../util/systems.h" 36 37 #include <arpa/inet.h> 38 #include <netinet/in.h> 39 #include <sys/socket.h> 40 #include <sys/types.h> 41 #include <netdb.h> 42 #include <unistd.h> 43 44 #include <openssl/bio.h> 45 #include <openssl/ssl.h> 46 #include <openssl/err.h> 47 48 #ifdef __cplusplus 49 extern "C" { 50 #endif 51 52 /* HttpListener typedef in nsapi.h */ 53 typedef struct _acceptor Acceptor; 54 typedef struct _listener_config ListenerConfig; 55 typedef struct _http_ssl HttpSSL; 56 57 typedef struct _ws_socket WSSocket; 58 59 60 union vs { 61 VirtualServer *vs; 62 char *vs_name; 63 }; 64 struct _listener_config { 65 ServerConfiguration *cfg; 66 cxmutstr name; 67 cxmutstr vs; 68 cxmutstr threadpool; 69 char *address; 70 int port; 71 int nacceptors; 72 WSBool blockingio; 73 WSBool ssl; 74 cxstring certfile; 75 cxstring privkeyfile; 76 cxstring chainfile; 77 cxstring disable_proto; 78 }; 79 80 struct _acceptor { 81 pthread_t tid; 82 HttpListener *listener; 83 WSBool ipv6; 84 WSBool exit; 85 WSBool running; 86 }; 87 88 struct _http_listener { 89 ServerConfiguration *cfg; 90 cxmutstr name; 91 union vs default_vs; 92 int port; 93 WSSocket *server_socket; 94 WSSocket *server_socket6; 95 SessionHandler *session_handler; 96 threadpool_t *threadpool; 97 HttpListener *next; 98 Acceptor **acceptors; 99 Acceptor **acceptors6; 100 int nacceptors; 101 uint32_t nacceptors_running; 102 int running; 103 104 pthread_mutex_t shutdown_mutex; 105 pthread_cond_t shutdown_cond; 106 WSBool shutdown; 107 }; 108 109 struct _http_ssl { 110 /* 111 unsigned char *cert; 112 size_t certlen; 113 unsigned char *privkey; 114 size_t privkeylen; 115 unsigned char *chain; 116 size_t chainlen; 117 */ 118 119 SSL_CTX *sslctx; 120 121 // TODO: ssl/tls cipher, ... config 122 }; 123 124 union ws_socketaddr { 125 struct sockaddr_in addr4; 126 struct sockaddr_in6 addr6; 127 }; 128 129 struct _ws_socket { 130 union ws_socketaddr addr; 131 struct sockaddr *sockaddr; 132 size_t sockaddr_size; 133 int socket; 134 WSBool listening; 135 HttpSSL *ssl; 136 uint32_t ref; // reference counter 137 }; 138 139 /* 140 * global listener init function 141 * must be called before any other listener initialization 142 */ 143 int http_listener_global_init(void); 144 145 int start_all_listener(); 146 147 HttpListener* http_listener_create(ListenerConfig *conf); 148 149 void http_listener_destroy(HttpListener *listener); 150 151 int http_listener_start(HttpListener *listener); 152 153 154 /* 155 * returns true of l1 and l2 share the same socket 156 */ 157 int http_listener_socket_eq(HttpListener *l1, HttpListener *l2); 158 159 /* 160 * set the succeeding listener 161 */ 162 void http_listener_set_next(HttpListener *listener, HttpListener *next); 163 164 /* 165 * Connect to the listener's server socket 166 * Returns a file descriptor or -1 167 */ 168 int http_listener_connect(HttpListener *listener, WSBool ipv6); 169 170 /* 171 * shutdown all acceptor threads 172 * this should be called, before any new acceptors for the same socket 173 * are started 174 */ 175 void http_listener_shutdown_acceptors(HttpListener *listener); 176 177 Acceptor* acceptor_new(HttpListener *listener); 178 179 void acceptor_start(Acceptor *a); 180 181 void* acceptor_thread(Acceptor *a); 182 183 void wssocket_ref(WSSocket *ws); 184 void wssocket_unref(WSSocket *ws); 185 186 int http_listener_apply_keep_alive_settings(HttpListener *listener, int fd); 187 188 189 #ifdef __cplusplus 190 } 191 #endif 192 193 #endif /* HTTPLISTENER_H */ 194 195