aboutsummaryrefslogtreecommitdiffstats
path: root/httpd.h
diff options
context:
space:
mode:
authorkraxel <kraxel>2004-06-08 12:51:57 +0000
committerkraxel <kraxel>2004-06-08 12:51:57 +0000
commit996cd0bab7bfff049402fe3eb3ca5de88d69ab41 (patch)
tree79d9e47fe25645bec085a0fecd1d7dda50a95918 /httpd.h
downloadwebfs-996cd0bab7bfff049402fe3eb3ca5de88d69ab41.tar.gz
Initial revision
Diffstat (limited to 'httpd.h')
-rw-r--r--httpd.h254
1 files changed, 254 insertions, 0 deletions
diff --git a/httpd.h b/httpd.h
new file mode 100644
index 0000000..31e0bef
--- /dev/null
+++ b/httpd.h
@@ -0,0 +1,254 @@
+#include <sys/stat.h>
+#ifdef USE_THREADS
+# include <pthread.h>
+#endif
+
+#define STATE_READ_HEADER 1
+#define STATE_PARSE_HEADER 2
+#define STATE_WRITE_HEADER 3
+#define STATE_WRITE_BODY 4
+#define STATE_WRITE_FILE 5
+#define STATE_WRITE_RANGES 6
+#define STATE_FINISHED 7
+
+#define STATE_KEEPALIVE 8
+#define STATE_CLOSE 9
+
+#define STATE_CGI_HEADER 10
+#define STATE_CGI_BODY_IN 11
+#define STATE_CGI_BODY_OUT 12
+
+#ifdef USE_SSL
+# include <openssl/ssl.h>
+#endif
+
+#define MAX_HEADER 4096
+#define MAX_PATH 2048
+#define MAX_HOST 64
+#define MAX_MISC 16
+#define BR_HEADER 512
+
+#define S1(str) #str
+#define S(str) S1(str)
+
+struct DIRCACHE {
+ char path[1024];
+ time_t mtime;
+ time_t add;
+ char *html;
+ int length;
+
+#ifdef USE_THREADS
+ pthread_mutex_t lock_refcount;
+ pthread_mutex_t lock_reading;
+ pthread_cond_t wait_reading;
+#endif
+ int refcount;
+ int reading;
+
+ struct DIRCACHE *next;
+};
+
+struct REQUEST {
+ int fd; /* socket handle */
+ int state; /* what to to ??? */
+ time_t ping; /* last read/write (for timeouts) */
+ int keep_alive;
+ int tcp_cork;
+
+ struct sockaddr_storage peer; /* client (log) */
+ char peerhost[MAX_HOST+1];
+ char peerserv[MAX_MISC+1];
+
+ /* request */
+ char hreq[MAX_HEADER+1]; /* request header */
+ int lreq; /* request length */
+ int hdata; /* data in hreq */
+ char type[MAX_MISC+1]; /* req type */
+ char hostname[MAX_HOST+1]; /* hostname */
+ char uri[MAX_PATH+1]; /* req uri */
+ char path[MAX_PATH+1]; /* file path */
+ char query[MAX_PATH+1]; /* query string */
+ int major,minor; /* http version */
+ char auth[64];
+ struct strlist *header;
+ time_t if_modified;
+ time_t if_unmodified;
+ time_t if_range;
+ char *range_hdr;
+ int ranges;
+ off_t *r_start;
+ off_t *r_end;
+ char *r_head;
+ int *r_hlen;
+
+ /* response */
+ int status; /* status code (log) */
+ int bc; /* byte counter (log) */
+ char hres[MAX_HEADER+1]; /* response header */
+ int lres; /* header length */
+ char *mime; /* mime type */
+ char *body;
+ off_t lbody;
+ int bfd; /* file descriptor */
+ struct stat bst; /* file info */
+ off_t written;
+ int head_only;
+ int rh,rb;
+ struct DIRCACHE *dir;
+
+ /* CGI */
+ int cgipid;
+ int cgipipe;
+ char cgibuf[MAX_HEADER+1];
+ int cgilen,cgipos;
+
+#ifdef USE_SSL
+ /* SSL */
+ SSL *ssl_s;
+#endif
+
+ /* linked list */
+ struct REQUEST *next;
+};
+
+/* --- string lists --------------------------------------------- */
+
+struct strlist {
+ struct strlist *next;
+ char *line;
+ int free_the_mallocs;
+};
+
+/* add element (list head) */
+static void inline
+list_add(struct strlist **list, char *line, int free_the_mallocs)
+{
+ struct strlist *elem = malloc(sizeof(struct strlist));
+ memset(elem,0,sizeof(struct strlist));
+ elem->next = *list;
+ elem->line = line;
+ elem->free_the_mallocs = free_the_mallocs;
+ *list = elem;
+}
+
+/* free whole list */
+static void inline
+list_free(struct strlist **list)
+{
+ struct strlist *elem,*next;
+
+ for (elem = *list; NULL != elem; elem = next) {
+ next = elem->next;
+ if (elem->free_the_mallocs)
+ free(elem->line);
+ free(elem);
+ }
+ *list = NULL;
+}
+
+/* --- main.c --------------------------------------------------- */
+
+extern int debug;
+extern int tcp_port;
+extern int max_dircache;
+extern int virtualhosts;
+extern int canonicalhost;
+extern int do_chroot;
+extern char *server_name;
+extern char *indexhtml;
+extern char *cgipath;
+extern char *doc_root;
+extern char server_host[];
+extern char *userpass;
+extern char *userdir;
+extern int lifespan;
+extern int no_listing;
+extern time_t now;
+extern int have_tty;
+
+#ifdef USE_SSL
+extern int with_ssl;
+extern SSL_CTX *ctx;
+extern BIO *sbio, *ssl_bio;
+extern char *certificate;
+extern char *password;
+#endif
+
+void xperror(int loglevel, char *txt, char *peerhost);
+void xerror(int loglevel, char *txt, char *peerhost);
+
+static void inline close_on_exec(int fd)
+{
+ if (cgipath)
+ fcntl(fd,F_SETFD,FD_CLOEXEC);
+}
+
+/* --- ssl.c ---------------------------------------------------- */
+
+#ifdef USE_SSL
+extern int ssl_read(struct REQUEST *req, char *buf, int len);
+extern int ssl_write(struct REQUEST *req, char *buf, int len);
+extern int ssl_blk_write(struct REQUEST *req, int offset, int len);
+extern void init_ssl(void);
+extern void open_ssl_session(struct REQUEST *req);
+#endif
+
+/* --- request.c ------------------------------------------------ */
+
+void read_request(struct REQUEST *req, int pipelined);
+void parse_request(struct REQUEST *req);
+
+/* --- response.c ----------------------------------------------- */
+
+extern char *h200,*h206,*h302,*h304;
+
+extern char *h403,*b403;
+extern char *h404,*b404;
+extern char *h500,*b500;
+extern char *h501,*b501;
+
+void mkerror(struct REQUEST *req, int status, int ka);
+void mkredirect(struct REQUEST *req);
+void mkheader(struct REQUEST *req, int status, time_t mtime);
+void mkcgi(struct REQUEST *req, char *status, struct strlist *header);
+void write_request(struct REQUEST *req);
+
+/* --- ls.c ----------------------------------------------------- */
+
+void init_quote(void);
+char* quote(unsigned char *path, int maxlength);
+struct DIRCACHE *get_dir(struct REQUEST *req, char *filename);
+void free_dir(struct DIRCACHE *dir);
+
+/* --- mime.c --------------------------------------------------- */
+
+char* get_mime(char *file);
+void init_mime(char *file, char *def);
+
+/* --- cgi.c ---------------------------------------------------- */
+
+void cgi_request(struct REQUEST *req);
+void cgi_read_header(struct REQUEST *req);
+
+/* -------------------------------------------------------------- */
+
+#ifdef USE_THREADS
+# define INIT_LOCK(mutex) pthread_mutex_init(&mutex,NULL)
+# define FREE_LOCK(mutex) pthread_mutex_destroy(&mutex)
+# define DO_LOCK(mutex) pthread_mutex_lock(&mutex)
+# define DO_UNLOCK(mutex) pthread_mutex_unlock(&mutex)
+# define INIT_COND(cond) pthread_cond_init(&cond,NULL)
+# define FREE_COND(cond) pthread_cond_destroy(&cond)
+# define BCAST_COND(cond) pthread_cond_broadcast(&cond);
+# define WAIT_COND(cond,mutex) pthread_cond_wait(&cond,&mutex);
+#else
+# define INIT_LOCK(mutex) /* nothing */
+# define FREE_LOCK(mutex) /* nothing */
+# define DO_LOCK(mutex) /* nothing */
+# define DO_UNLOCK(mutex) /* nothing */
+# define INIT_COND(cond) /* nothing */
+# define FREE_COND(cond) /* nothing */
+# define BCAST_COND(cond) /* nothing */
+# define WAIT_COND(cond,mutex) /* nothing */
+#endif