X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fsysdep.c;h=1278b56259ea984b8bf3a6c4b5437bfe1544208f;hb=c73091a2ae896b6be5aa94b911c1c89d76a85688;hp=197d2df6f692801bbe1fedd8aa4842f8d897e04d;hpb=8661437c7dac0f3f7e2a1749a9ca1fd7b894b2ed;p=citadel.git diff --git a/webcit/sysdep.c b/webcit/sysdep.c index 197d2df6f..1278b5625 100644 --- a/webcit/sysdep.c +++ b/webcit/sysdep.c @@ -1,21 +1,15 @@ /* * WebCit "system dependent" code. * - * Copyright (c) 1996-2011 by the citadel.org team + * Copyright (c) 1996-2012 by the citadel.org team * * This program is open source software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * it under the terms of the GNU General Public License, version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "sysdep.h" @@ -31,18 +25,7 @@ #include #include #include - -#if TIME_WITH_SYS_TIME -# include -# include -#else -# if HAVE_SYS_TIME_H -# include -# else -# include -# endif -#endif - +#include #include #include #include @@ -65,9 +48,6 @@ #include #endif -#ifndef HAVE_SNPRINTF -#include "snprintf.h" -#endif #include "webserver.h" #include "modules_init.h" #if HAVE_BACKTRACE @@ -88,8 +68,11 @@ char ctdl_key_dir[PATH_MAX]=SSL_DIR; char file_crpt_file_key[PATH_MAX]=""; char file_crpt_file_csr[PATH_MAX]=""; char file_crpt_file_cer[PATH_MAX]=""; +char file_etc_mimelist[PATH_MAX]=""; const char editor_absolut_dir[PATH_MAX]=EDITORDIR; /* nailed to what configure gives us. */ + +char etc_dir[PATH_MAX]; char static_dir[PATH_MAX]; /* calculated on startup */ char static_local_dir[PATH_MAX]; /* calculated on startup */ char static_icon_dir[PATH_MAX]; /* where should we find our mime icons? */ @@ -101,6 +84,62 @@ char *static_dirs[]={ /* needs same sort order as the web mapping */ }; int ExitPipe[2]; +HashList *GZMimeBlackList = NULL; /* mimetypes which shouldn't be gzip compressed */ + +void LoadMimeBlacklist(void) +{ + StrBuf *MimeBlackLine; + IOBuffer IOB; + eReadState state; + + memset(&IOB, 0, sizeof(IOBuffer)); + IOB.fd = open(file_etc_mimelist, O_RDONLY); + + IOB.Buf = NewStrBuf(); + MimeBlackLine = NewStrBuf(); + GZMimeBlackList = NewHash(1, NULL); + + do + { + state = StrBufChunkSipLine(MimeBlackLine, &IOB); + + switch (state) + { + case eMustReadMore: + if (StrBuf_read_one_chunk_callback(IOB.fd, 0, &IOB) <= 0) + state = eReadFail; + break; + case eReadSuccess: + if ((StrLength(MimeBlackLine) > 1) && + (*ChrPtr(MimeBlackLine) != '#')) + { + Put(GZMimeBlackList, SKEY(MimeBlackLine), + (void*) 1, reference_free_handler); + } + FlushStrBuf(MimeBlackLine); + break; + case eReadFail: + break; + case eBufferNotEmpty: + break; + } + } + while (state != eReadFail); + + close(IOB.fd); + + FreeStrBuf(&IOB.Buf); + FreeStrBuf(&MimeBlackLine); +} + +void CheckGZipCompressionAllowed(const char *MimeType, long MLen) +{ + void *v; + wcsession *WCC = WC; + + if (WCC->Hdr->HR.gzip_ok) + WCC->Hdr->HR.gzip_ok = GetHash(GZMimeBlackList, MimeType, MLen, &v) == 0; +} void InitialiseSemaphores(void) { @@ -113,7 +152,7 @@ void InitialiseSemaphores(void) if (pipe(ExitPipe)) { - syslog(2, "Failed to open exit pipe: %d [%s]\n", + syslog(LOG_WARNING, "Failed to open exit pipe: %d [%s]\n", errno, strerror(errno)); @@ -140,6 +179,8 @@ void end_critical_section(int which_one) void ShutDownWebcit(void) { + + DeleteHash(&GZMimeBlackList); free_zone_directory (); icaltimezone_release_zone_tab (); icalmemory_free_ring (); @@ -204,17 +245,17 @@ void worker_entry(void) if (shutdown == 1) {/* we're the one to cleanup the mess. */ http_destroy_modules(&Hdr); - syslog(2, "I'm master shutdown: tagging sessions to be killed.\n"); + syslog(LOG_DEBUG, "I'm master shutdown: tagging sessions to be killed.\n"); shutdown_sessions(); - syslog(2, "master shutdown: waiting for others\n"); + syslog(LOG_DEBUG, "master shutdown: waiting for others\n"); sleeeeeeeeeep(1); /* wait so some others might finish... */ - syslog(2, "master shutdown: cleaning up sessions\n"); + syslog(LOG_DEBUG, "master shutdown: cleaning up sessions\n"); do_housekeeping(); - syslog(2, "master shutdown: cleaning up libical\n"); + syslog(LOG_DEBUG, "master shutdown: cleaning up libical\n"); ShutDownWebcit(); - syslog(2, "master shutdown exiting.\n"); + syslog(LOG_DEBUG, "master shutdown exiting.\n"); exit(0); } break; @@ -226,7 +267,7 @@ void worker_entry(void) /* Now do something. */ if (msock < 0) { if (ssock > 0) close (ssock); - syslog(2, "in between."); + syslog(LOG_DEBUG, "in between."); pthread_exit(NULL); } else { /* Got it? do some real work! */ @@ -248,11 +289,11 @@ void worker_entry(void) int fdflags; fdflags = fcntl(ssock, F_GETFL); if (fdflags < 0) - syslog(1, "unable to get server socket flags! %s \n", + syslog(LOG_WARNING, "unable to get server socket flags! %s \n", strerror(errno)); fdflags = fdflags | O_NONBLOCK; if (fcntl(ssock, F_SETFL, fdflags) < 0) - syslog(1, "unable to set server socket nonblocking flags! %s \n", + syslog(LOG_WARNING, "unable to set server socket nonblocking flags! %s \n", strerror(errno)); } @@ -282,7 +323,7 @@ void worker_entry(void) } while (!time_to_die); http_destroy_modules(&Hdr); - syslog(1, "Thread exiting.\n"); + syslog(LOG_DEBUG, "Thread exiting.\n"); pthread_exit(NULL); } @@ -293,7 +334,7 @@ void worker_entry(void) */ pid_t current_child; void graceful_shutdown_watcher(int signum) { - syslog(1, "Watcher thread exiting.\n"); + syslog(LOG_INFO, "Watcher thread exiting.\n"); write(ExitPipe[0], HKEY(" ")); kill(current_child, signum); if (signum != SIGHUP) @@ -310,7 +351,7 @@ void graceful_shutdown(int signum) { FILE *FD; int fd; - syslog(1, "WebCit is being shut down on signal %d.\n", signum); + syslog(LOG_INFO, "WebCit is being shut down on signal %d.\n", signum); fd = msock; msock = -1; time_to_die = 1; @@ -331,8 +372,6 @@ void start_daemon(char *pid_file) pid_t child = 0; FILE *fp; int do_restart = 0; - int rv; - FILE *rvfp = NULL; current_child = 0; @@ -340,7 +379,7 @@ void start_daemon(char *pid_file) * We don't just call close() because we don't want these fd's * to be reused for other files. */ - rv = chdir("/"); + chdir("/"); signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); @@ -353,9 +392,9 @@ void start_daemon(char *pid_file) setsid(); umask(0); - rvfp = freopen("/dev/null", "r", stdin); - rvfp = freopen("/dev/null", "w", stdout); - rvfp = freopen("/dev/null", "w", stderr); + freopen("/dev/null", "r", stdin); + freopen("/dev/null", "w", stdout); + freopen("/dev/null", "w", stderr); signal(SIGTERM, graceful_shutdown_watcher); signal(SIGHUP, graceful_shutdown_watcher); @@ -442,13 +481,13 @@ void spawn_another_worker_thread() * otherwise the MIME parser crashes on FreeBSD. */ if ((ret = pthread_attr_setstacksize(&attr, 1024 * 1024))) { - syslog(1, "pthread_attr_setstacksize: %s\n", strerror(ret)); + syslog(LOG_WARNING, "pthread_attr_setstacksize: %s\n", strerror(ret)); pthread_attr_destroy(&attr); } /* now create the thread */ if (pthread_create(&SessThread, &attr, (void *(*)(void *)) worker_entry, NULL) != 0) { - syslog(1, "Can't create thread: %s\n", strerror(errno)); + syslog(LOG_WARNING, "Can't create thread: %s\n", strerror(errno)); } /* free up the attributes */ @@ -497,8 +536,17 @@ webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdi "%s/citadel.cer", ctdl_key_dir); + + basedir=ETCDIR; + COMPUTE_DIRECTORY(etc_dir); + StripSlashes(etc_dir, 1); + snprintf(file_etc_mimelist, + sizeof file_etc_mimelist, + "%s/nogz-mimetypes.txt", + etc_dir); + /* we should go somewhere we can leave our coredump, if enabled... */ - syslog(9, "Changing directory to %s\n", socket_dir); + syslog(LOG_INFO, "Changing directory to %s\n", socket_dir); if (chdir(webcitdir) != 0) { perror("chdir"); } @@ -507,6 +555,9 @@ webcit_calc_dirs_n_files(int relh, const char *basedir, int home, char *webcitdi void drop_root(uid_t UID) { struct passwd pw, *pwp = NULL; +#ifdef HAVE_GETPWUID_R + char pwbuf[SIZ]; +#endif /* * Now that we've bound the sockets, change to the Citadel user id and its @@ -548,7 +599,7 @@ void drop_root(uid_t UID) /* * print the actual stack frame. */ -void wc_backtrace(void) +void wc_backtrace(long LogLevel) { #ifdef HAVE_BACKTRACE void *stack_frames[50]; @@ -560,9 +611,9 @@ void wc_backtrace(void) strings = backtrace_symbols(stack_frames, size); for (i = 0; i < size; i++) { if (strings != NULL) - syslog(1, "%s\n", strings[i]); + syslog(LogLevel, "%s\n", strings[i]); else - syslog(1, "%p\n", stack_frames[i]); + syslog(LogLevel, "%p\n", stack_frames[i]); } free(strings); #endif