/*
* 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"
pthread_key_t MyReq; /* TSD key for MyReq() */
int msock; /* master listening socket */
int time_to_die = 0; /* Nonzero if server is shutting down */
-int verbosity = 9; /* Logging level */
extern void *context_loop(ParsedHttpHdrs *Hdr);
extern void *housekeeping_loop(void);
+extern void do_housekeeping(void);
char ctdl_key_dir[PATH_MAX]=SSL_DIR;
char file_crpt_file_key[PATH_MAX]="";
(char*)static_icon_dir /* our icons... */
};
+int ExitPipe[2];
+
void InitialiseSemaphores(void)
{
int i;
for (i=0; i<MAX_SEMAPHORES; ++i) {
pthread_mutex_init(&Critters[i], NULL);
}
+
+ if (pipe(ExitPipe))
+ {
+ syslog(2, "Failed to open exit pipe: %d [%s]\n",
+ errno,
+ strerror(errno));
+
+ exit(-1);
+ }
}
/*
ssock = -1;
errno = EAGAIN;
do {
+ fd_set wset;
--num_threads_executing;
+ FD_ZERO(&wset);
+ FD_SET(msock, &wset);
+ FD_SET(ExitPipe[1], &wset);
+
+ select(msock + 1, NULL, &wset, NULL, NULL);
+ if (time_to_die)
+ break;
+
ssock = accept(msock, NULL, 0);
++num_threads_executing;
if (ssock < 0) fail_this_transaction = 1;
pid_t current_child;
void graceful_shutdown_watcher(int signum) {
syslog(1, "Watcher thread exiting.\n");
+ write(ExitPipe[0], HKEY(" "));
kill(current_child, signum);
if (signum != SIGHUP)
exit(0);
fflush (FD);
fclose (FD);
close(fd);
+ write(ExitPipe[0], HKEY(" "));
}
pid_t child = 0;
FILE *fp;
int do_restart = 0;
- int rv;
- FILE *rvfp = NULL;
current_child = 0;
* 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);
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);
#ifdef HAVE_GETPWUID_R
#ifdef SOLARIS_GETPWUID
pwp = getpwuid_r(UID, &pw, pwbuf, sizeof(pwbuf));
-#else // SOLARIS_GETPWUID
+#else /* SOLARIS_GETPWUID */
getpwuid_r(UID, &pw, pwbuf, sizeof(pwbuf), &pwp);
-#endif // SOLARIS_GETPWUID
-#else // HAVE_GETPWUID_R
+#endif /* SOLARIS_GETPWUID */
+#else /* HAVE_GETPWUID_R */
pwp = NULL;
-#endif // HAVE_GETPWUID_R
+#endif /* HAVE_GETPWUID_R */
if (pwp == NULL)
- syslog(LOG_CRIT, "WARNING: getpwuid(%ld): %s\n"
+ syslog(LOG_CRIT, "WARNING: getpwuid(%d): %s\n"
"Group IDs will be incorrect.\n", UID,
strerror(errno));
else {