- prepend accept() by select()
- open a pipe to ourselves, so we can wake us up on all selects() waiting for input -> clean shutdown.
(char*)static_icon_dir /* our icons... */
};
(char*)static_icon_dir /* our icons... */
};
void InitialiseSemaphores(void)
{
int i;
void InitialiseSemaphores(void)
{
int i;
for (i=0; i<MAX_SEMAPHORES; ++i) {
pthread_mutex_init(&Critters[i], NULL);
}
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 {
ssock = -1;
errno = EAGAIN;
do {
+ 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;
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");
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);
kill(current_child, signum);
if (signum != SIGHUP)
exit(0);
fflush (FD);
fclose (FD);
close(fd);
fflush (FD);
fclose (FD);
close(fd);
+ write(ExitPipe[0], HKEY(" "));
#ifdef HAVE_GETPWUID_R
#ifdef SOLARIS_GETPWUID
pwp = getpwuid_r(UID, &pw, pwbuf, sizeof(pwbuf));
#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);
getpwuid_r(UID, &pw, pwbuf, sizeof(pwbuf), &pwp);
-#endif // SOLARIS_GETPWUID
-#else // HAVE_GETPWUID_R
+#endif /* SOLARIS_GETPWUID */
+#else /* HAVE_GETPWUID_R */
-#endif // HAVE_GETPWUID_R
+#endif /* HAVE_GETPWUID_R */
- 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 {
"Group IDs will be incorrect.\n", UID,
strerror(errno));
else {