From 0efa8343b332016ab5a55e8aa726d3c379e17ea2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Wilfried=20G=C3=B6esgens?= Date: Wed, 15 Aug 2007 22:22:39 +0000 Subject: [PATCH] * some of the shiny new citadel optimized functions * terminate well for gprof --- webcit/configure.ac | 2 +- webcit/tools.c | 15 +++++++-------- webcit/webcit.h | 2 +- webcit/webserver.c | 24 +++++++++++++++++++++--- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/webcit/configure.ac b/webcit/configure.ac index ce25377fa..992c4321a 100644 --- a/webcit/configure.ac +++ b/webcit/configure.ac @@ -94,7 +94,7 @@ dnl AC_HEADER_TIME dnl Checks for library functions. AC_TYPE_SIGNAL dnl AC_FUNC_VPRINTF -dnl AC_CHECK_FUNCS(strerror) +AC_CHECK_FUNCS(backtrace) AC_REPLACE_FUNCS(snprintf) dnl Checks for the libical calendaring library. diff --git a/webcit/tools.c b/webcit/tools.c index f83a7d863..6ee7f3cbe 100644 --- a/webcit/tools.c +++ b/webcit/tools.c @@ -187,13 +187,14 @@ long extract_long(const char *source, int parmnum) * \param ch the char to search * \return the position inside of st */ -int haschar(char *st,char ch) +int haschar(const char *st,char ch) { - int a, b, len; + const char *ptr; + int b; b = 0; - len = strlen(st); - for (a = 0; a < len; ++a) - if (st[a] == ch) + ptr = st; + while (!IsEmptyStr(ptr)) + if (*ptr == ch) ++b; return (b); } @@ -213,15 +214,13 @@ char *memreadline(char *start, char *buf, int maxlen) int len = 0; /**< tally our own length to avoid strlen() delays */ ptr = start; - memset(buf, 0, maxlen); - while (1) { ch = *ptr++; if ((len + 1 < (maxlen)) && (ch != 13) && (ch != 10)) { buf[len++] = ch; - buf[len] = 0; } if ((ch == 10) || (ch == 0)) { + buf[len] = 0; return ptr; } } diff --git a/webcit/webcit.h b/webcit/webcit.h index 741003e69..3068770ab 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -498,7 +498,7 @@ void stripout(char *str, char leftboundary, char rightboundary); void dump_vars(void); void embed_main_menu(void); void serv_read(char *buf, int bytes); -int haschar(char *, char); +int haschar(const char *, char); void readloop(char *oper); void read_message(long msgnum, int printable_view, char *section); void embed_message(char *msgnum_as_string); diff --git a/webcit/webserver.c b/webcit/webserver.c index b56e15bdd..07f8fad85 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -25,6 +25,7 @@ int msock; /**< master listening socket */ 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; /**< shold we shut down? */ extern void *context_loop(int); extern void *housekeeping_loop(void); extern pthread_mutex_t SessionListMutex; @@ -455,11 +456,24 @@ int client_getln(int sock, char *buf, int bufsiz) * param signum the signal we want to forward */ pid_t current_child; -void graceful_shutdown(int signum) { +void graceful_shutdown_watcher(int signum) { + lprintf (1, "bye; shutting down watcher."); kill(current_child, signum); exit(0); } +/** + * \brief shut us down the regular way. + * param signum the signal we want to forward + */ +pid_t current_child; +void graceful_shutdown(int signum) { +// kill(current_child, signum); + lprintf (1, "bye going down gracefull."); + time_to_die = 1; + exit(0); +} + /** * \brief Start running as a daemon. @@ -499,6 +513,7 @@ void start_daemon(char *pid_file) freopen("/dev/null", "r", stdin); freopen("/dev/null", "w", stdout); freopen("/dev/null", "w", stderr); + signal(SIGTERM, graceful_shutdown_watcher); do { current_child = fork(); @@ -511,7 +526,7 @@ void start_daemon(char *pid_file) else if (current_child == 0) { signal(SIGTERM, graceful_shutdown); - return; /* continue starting citadel. */ + return; /* continue starting webcit. */ } else { @@ -713,6 +728,9 @@ int main(int argc, char **argv) if (running_as_daemon) { start_daemon(pidfile); } + else { + signal(SIGTERM, graceful_shutdown); + } /** Tell 'em who's in da house */ lprintf(1, SERVER "\n"); @@ -837,7 +855,6 @@ void worker_entry(void) { int ssock; int i = 0; - int time_to_die = 0; int fail_this_transaction = 0; do { @@ -883,6 +900,7 @@ void worker_entry(void) } while (!time_to_die); + lprintf (1, "bye"); pthread_exit(NULL); } -- 2.39.2