kernel: fq_codel: dont reinit flow state
[openwrt.git] / package / uhttpd / src / uhttpd.h
index c8fdaf4..f6982db 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdbool.h>
 #include <string.h>
 #include <unistd.h>
 #include <signal.h>
@@ -28,6 +29,7 @@
 #include <sys/select.h>
 #include <sys/wait.h>
 #include <netinet/in.h>
+#include <netinet/tcp.h>
 #include <arpa/inet.h>
 #include <linux/limits.h>
 #include <netdb.h>
@@ -35,6 +37,9 @@
 #include <errno.h>
 #include <dlfcn.h>
 
+#include <libubox/list.h>
+#include <libubox/uloop.h>
+
 
 #ifdef HAVE_LUA
 #include <lua.h>
 #include <openssl/ssl.h>
 #endif
 
+/* uClibc... */
+#ifndef SOL_TCP
+#define SOL_TCP        6
+#endif
+
+#ifdef DEBUG
+#define D(...) fprintf(stderr, __VA_ARGS__)
+#else
+#define D(...)
+#endif
+
 
 #define UH_LIMIT_MSGHEAD       4096
 #define UH_LIMIT_HEADERS       64
-
-#define UH_LIMIT_LISTENERS     16
 #define UH_LIMIT_CLIENTS       64
-#define UH_LIMIT_AUTHREALMS    8
 
-#define UH_HTTP_MSG_GET                0
-#define UH_HTTP_MSG_HEAD       1
-#define UH_HTTP_MSG_POST       2
 
 struct listener;
 struct client;
+struct interpreter;
 struct http_request;
+struct uh_ubus_state;
 
 struct config {
        char docroot[PATH_MAX];
@@ -69,17 +81,29 @@ struct config {
        int no_symlinks;
        int no_dirlists;
        int network_timeout;
+       int rfc1918_filter;
+       int tcp_keepalive;
+       int max_requests;
 #ifdef HAVE_CGI
        char *cgi_prefix;
 #endif
 #ifdef HAVE_LUA
        char *lua_prefix;
        char *lua_handler;
-       lua_State * (*lua_init) (const char *handler);
+       lua_State *lua_state;
+       lua_State * (*lua_init) (const struct config *conf);
        void (*lua_close) (lua_State *L);
-       void (*lua_request) (struct client *cl, struct http_request *req, lua_State *L);
+       bool (*lua_request) (struct client *cl, lua_State *L);
 #endif
-#if defined(HAVE_CGI) || defined(HAVE_LUA)
+#ifdef HAVE_UBUS
+       char *ubus_prefix;
+       char *ubus_socket;
+       void *ubus_state;
+       struct uh_ubus_state * (*ubus_init) (const struct config *conf);
+       void (*ubus_close) (struct uh_ubus_state *state);
+       bool (*ubus_request) (struct client *cl, struct uh_ubus_state *state);
+#endif
+#if defined(HAVE_CGI) || defined(HAVE_LUA) || defined(HAVE_UBUS)
        int script_timeout;
 #endif
 #ifdef HAVE_TLS
@@ -90,54 +114,101 @@ struct config {
        int (*tls_cert) (SSL_CTX *c, const char *file);
        int (*tls_key) (SSL_CTX *c, const char *file);
        void (*tls_free) (struct listener *l);
-       void (*tls_accept) (struct client *c);
+       int (*tls_accept) (struct client *c);
        void (*tls_close) (struct client *c);
-       int (*tls_recv) (struct client *c, void *buf, int len);
-       int (*tls_send) (struct client *c, void *buf, int len);
+       int (*tls_recv) (struct client *c, char *buf, int len);
+       int (*tls_send) (struct client *c, const char *buf, int len);
 #endif
 };
 
+enum http_method {
+       UH_HTTP_MSG_GET,
+       UH_HTTP_MSG_POST,
+       UH_HTTP_MSG_HEAD,
+};
+
+extern const char *http_methods[];
+
+enum http_version {
+       UH_HTTP_VER_0_9,
+       UH_HTTP_VER_1_0,
+       UH_HTTP_VER_1_1,
+};
+
+extern const char *http_versions[];
+
+struct http_request {
+       enum http_method method;
+       enum http_version version;
+       int redirect_status;
+       char *url;
+       char *headers[UH_LIMIT_HEADERS];
+       struct auth_realm *realm;
+};
+
+struct http_response {
+       int statuscode;
+       char *statusmsg;
+       char *headers[UH_LIMIT_HEADERS];
+};
+
 struct listener {
+       struct uloop_fd fd;
        int socket;
+       int n_clients;
        struct sockaddr_in6 addr;
        struct config *conf;
 #ifdef HAVE_TLS
        SSL_CTX *tls;
 #endif
+       struct listener *next;
 };
 
 struct client {
-       int socket;
-       int peeklen;
-       char peekbuf[UH_LIMIT_MSGHEAD];
+#ifdef HAVE_TLS
+       SSL *tls;
+#endif
+       struct uloop_fd fd;
+       struct uloop_fd rpipe;
+       struct uloop_fd wpipe;
+       struct uloop_process proc;
+       struct uloop_timeout timeout;
+       bool (*cb)(struct client *);
+       void *priv;
+       bool dispatched;
+       struct {
+               char buf[UH_LIMIT_MSGHEAD];
+               char *ptr;
+               int len;
+       } httpbuf;
        struct listener *server;
+       struct http_request request;
+       struct http_response response;
        struct sockaddr_in6 servaddr;
        struct sockaddr_in6 peeraddr;
+       struct client *next;
+};
+
+struct client_light {
 #ifdef HAVE_TLS
        SSL *tls;
 #endif
+       struct uloop_fd fd;
 };
 
 struct auth_realm {
        char path[PATH_MAX];
        char user[32];
        char pass[128];
+       struct auth_realm *next;
 };
 
-struct http_request {
-       int     method;
-       float version;
-       int redirect_status;
-       char *url;
-       char *headers[UH_LIMIT_HEADERS];
-       struct auth_realm *realm;
-};
-
-struct http_response {
-       int statuscode;
-       char *statusmsg;
-       char *headers[UH_LIMIT_HEADERS];
+#ifdef HAVE_CGI
+struct interpreter {
+       char path[PATH_MAX];
+       char extn[32];
+       struct interpreter *next;
 };
-
 #endif
 
+#endif