X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fwebserver.c;h=ae20319e5c9277ac05b06b956679c42d4f5876ea;hb=3f2df24202afa6d8314a477ac51958dc28333ced;hp=56a34eb063d819be8435bedf38d7165f461987c8;hpb=71c59e023dbd1d384b26c28bab28a9934710b417;p=citadel.git diff --git a/webcit/webserver.c b/webcit/webserver.c index 56a34eb06..ae20319e5 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -24,7 +24,7 @@ int is_https = 0; /* Nonzero if I am an HTTPS service */ int follow_xff = 0; /* Follow X-Forwarded-For: header */ int home_specified = 0; /* did the user specify a homedir? */ int time_to_die = 0; /* Nonzero if server is shutting down */ -extern void *context_loop(int); +extern void *context_loop(int*); extern void *housekeeping_loop(void); extern pthread_mutex_t SessionListMutex; extern pthread_key_t MyConKey; @@ -193,7 +193,7 @@ int ig_uds_server(char *sockpath, int queue_len) * 0 Request timed out. * -1 Connection is broken, or other error. */ -int client_read_to(int sock, char *buf, int bytes, int timeout) +int client_read_to(int *sock, char *buf, int bytes, int timeout) { int len, rlen; fd_set rfds; @@ -208,22 +208,25 @@ int client_read_to(int sock, char *buf, int bytes, int timeout) #endif len = 0; - while (len < bytes) { + while ((len < bytes) && (*sock > 0)) { FD_ZERO(&rfds); - FD_SET(sock, &rfds); + FD_SET(*sock, &rfds); tv.tv_sec = timeout; tv.tv_usec = 0; - retval = select((sock) + 1, &rfds, NULL, NULL, &tv); - if (FD_ISSET(sock, &rfds) == 0) { + retval = select((*sock) + 1, &rfds, NULL, NULL, &tv); + if (FD_ISSET(*sock, &rfds) == 0) { return (0); } - rlen = read(sock, &buf[len], bytes - len); + rlen = read(*sock, &buf[len], bytes - len); if (rlen < 1) { lprintf(2, "client_read() failed: %s\n", strerror(errno)); + if (*sock > 0) + close(*sock); + *sock = -1; return (-1); } len = len + rlen; @@ -242,7 +245,8 @@ int client_read_to(int sock, char *buf, int bytes, int timeout) */ void begin_burst(void) { - WC->WBuf = NewStrBufPlain(NULL, 32768); + if (WC->WBuf == NULL) + WC->WBuf = NewStrBufPlain(NULL, 32768); } @@ -274,7 +278,8 @@ long end_burst(void) #ifdef HAVE_OPENSSL if (is_https) { - client_write_ssl(ptr, StrLength(WCC->HBuf)); + client_write_ssl(WCC->HBuf); + client_write_ssl(WCC->WBuf); return (count); } #endif @@ -288,7 +293,7 @@ long end_burst(void) #endif fdflags = fcntl(WC->http_sock, F_GETFL); - while (ptr < eptr) { + while (ptr < eptr) { if ((fdflags & O_NONBLOCK) == O_NONBLOCK) { FD_ZERO(&wset); FD_SET(WCC->http_sock, &wset); @@ -302,6 +307,7 @@ long end_burst(void) ptr, count)) == -1) { lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno)); + wc_backtrace(); return res; } count -= res; @@ -312,13 +318,6 @@ long end_burst(void) count = StrLength(WCC->WBuf); eptr = ptr + count; -#ifdef HAVE_OPENSSL - if (is_https) { - client_write_ssl(ptr, StrLength(WCC->HBuf)); - return (count); - } -#endif - #ifdef HTTP_TRACING write(2, "\033[34m", 5); @@ -340,6 +339,7 @@ long end_burst(void) ptr, count)) == -1) { lprintf(2, "client_write: Socket write failed (%s)\n", strerror(errno)); + wc_backtrace(); return res; } count -= res; @@ -359,7 +359,7 @@ long end_burst(void) * \param buf the buffer to write to * \param bytes Number of bytes to read */ -int client_read(int sock, char *buf, int bytes) +int client_read(int *sock, char *buf, int bytes) { return (client_read_to(sock, buf, bytes, SLEEPING)); } @@ -374,13 +374,15 @@ int client_read(int sock, char *buf, int bytes) * \param bufsiz how many bytes to read * \return number of bytes read??? */ -int client_getln(int sock, char *buf, int bufsiz) +int client_getln(int *sock, char *buf, int bufsiz) { int i, retval; /* Read one character at a time.*/ - for (i = 0;; i++) { + for (i = 0; *sock > 0; i++) { retval = client_read(sock, &buf[i], 1); + if (retval < 0) + return retval; if (retval != 1 || buf[i] == '\n' || i == (bufsiz-1)) break; if ( (!isspace(buf[i])) && (!isprint(buf[i])) ) { @@ -586,7 +588,9 @@ void spawn_another_worker_thread() const char foobuf[32]; const char *nix(void *vptr) {snprintf(foobuf, 32, "%0x", (long) vptr); return foobuf;} #endif - +void InitTemplateCache(void); +extern int LoadTemplates; +extern void LoadZoneFiles(void); /* * \brief Here's where it all begins. * \param argc number of commandline args @@ -615,7 +619,16 @@ int main(int argc, char **argv) char uds_listen_path[PATH_MAX]; /*< listen on a unix domain socket? */ HandlerHash = NewHash(1, NULL); - initialise_modules(); + PreferenceHooks = NewHash(1, NULL); + WirelessTemplateCache = NewHash(1, NULL); + WirelessLocalTemplateCache = NewHash(1, NULL); + LocalTemplateCache = NewHash(1, NULL); + TemplateCache = NewHash(1, NULL); + GlobalNS = NewHash(1, NULL); + Iterators = NewHash(1, NULL); + Contitionals = NewHash(1, NULL); + LoadZoneFiles(); + #ifdef DBG_PRINNT_HOOKS_AT_START dbg_PrintHash(HandlerHash, nix, NULL); @@ -634,9 +647,9 @@ int main(int argc, char **argv) /* Parse command line */ #ifdef HAVE_OPENSSL - while ((a = getopt(argc, argv, "h:i:p:t:x:dD:cfs")) != EOF) + while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cfs")) != EOF) #else - while ((a = getopt(argc, argv, "h:i:p:t:x:dD:cf")) != EOF) + while ((a = getopt(argc, argv, "h:i:p:t:T:x:dD:cf")) != EOF) #endif switch (a) { case 'h': @@ -673,6 +686,9 @@ int main(int argc, char **argv) freopen(tracefile, "w", stderr); freopen(tracefile, "r", stdin); break; + case 'T': + LoadTemplates = atoi(optarg); + break; case 'x': verbosity = atoi(optarg); break; @@ -701,6 +717,7 @@ int main(int argc, char **argv) fprintf(stderr, "usage: webcit " "[-i ip_addr] [-p http_port] " "[-t tracefile] [-c] [-f] " + "[-T Templatedebuglevel] " "[-d] " #ifdef HAVE_OPENSSL "[-s] " @@ -787,6 +804,9 @@ int main(int argc, char **argv) perror("chdir"); } LoadIconDir(static_icon_dir); + InitTemplateCache(); + + initialise_modules(); initialize_viewdefs(); initialize_axdefs(); @@ -859,10 +879,32 @@ int main(int argc, char **argv) worker_entry(); ShutDownLibCitadel (); DeleteHash(&HandlerHash); + DeleteHash(&PreferenceHooks); return 0; } +void ShutDownWebcit(void) +{ + DeleteHash(&ZoneHash); + free_zone_directory (); + icaltimezone_release_zone_tab (); + icalmemory_free_ring (); + ShutDownLibCitadel (); + DeleteHash(&HandlerHash); + DeleteHash(&PreferenceHooks); + DeleteHash(&GlobalNS); + DeleteHash(&WirelessTemplateCache); + DeleteHash(&WirelessLocalTemplateCache); + DeleteHash(&TemplateCache); + DeleteHash(&LocalTemplateCache); + DeleteHash(&Iterators); + DeleteHash(&Contitionals); +#ifdef ENABLE_NLS + ShutdownLocale(); +#endif +} + /* * Entry point for worker threads */ @@ -930,10 +972,9 @@ void worker_entry(void) lprintf(2, "master shutdown: cleaning up sessions\n"); do_housekeeping(); lprintf(2, "master shutdown: cleaning up libical\n"); - free_zone_directory (); - icaltimezone_release_zone_tab (); - icalmemory_free_ring (); - ShutDownLibCitadel (); + + ShutDownWebcit(); + lprintf(2, "master shutdown exiting!.\n"); exit(0); } @@ -964,7 +1005,7 @@ void worker_entry(void) if (fail_this_transaction == 0) { /* Perform an HTTP transaction... */ - context_loop(ssock); + context_loop(&ssock); /* Shut down SSL/TLS if required... */ #ifdef HAVE_OPENSSL @@ -974,7 +1015,8 @@ void worker_entry(void) #endif /* ...and close the socket. */ - lingering_close(ssock); + if (ssock > 0) + lingering_close(ssock); } }