+ ssock = -1;
+ errno = EAGAIN;
+ do {
+ ret = -1; /* just one at once should select... */
+ begin_critical_section(S_SELECT);
+
+ FD_ZERO(&tempset);
+ if (msock > 0) FD_SET(msock, &tempset);
+ tv.tv_sec = 0;
+ tv.tv_usec = 10000;
+ if (msock > 0) ret = select(msock+1, &tempset, NULL, NULL, &tv);
+ end_critical_section(S_SELECT);
+ if ((ret < 0) && (errno != EINTR) && (errno != EAGAIN))
+ {// EINTR and EAGAIN are thrown but not of interest.
+ lprintf(2, "accept() failed:%d %s\n",
+ errno, strerror(errno));
+ }
+ else if ((ret > 0) && (msock > 0) && FD_ISSET(msock, &tempset))
+ {// Successfully selected, and still not shutting down? Accept!
+ ssock = accept(msock, NULL, 0);
+ }
+
+ } while ((msock > 0) && (ssock < 0) && (time_to_die == 0));
+
+ if ((msock == -1)||(time_to_die))
+ {// ok, we're going down.
+ int shutdown = 0;
+
+ /* the first to come here will have to do the cleanup.
+ * make shure its realy just one.
+ */
+ begin_critical_section(S_SHUTDOWN);
+ if (msock == -1)
+ {
+ msock = -2;
+ shutdown = 1;
+ }
+ end_critical_section(S_SHUTDOWN);
+ if (shutdown == 1)
+ {// we're the one to cleanup the mess.
+ lprintf(2, "I'm master shutdown: tagging sessions to be killed.\n");
+ shutdown_sessions();
+ lprintf(2, "master shutdown: waiting for others\n");
+ sleeeeeeeeeep(1); // wait so some others might finish...
+ lprintf(2, "master shutdown: cleaning up sessions\n");
+ do_housekeeping();
+ lprintf(2, "master shutdown exiting!.\n");
+ exit(0);
+ }
+ break;
+ }
+ if (ssock < 0 ) continue;
+
+ if (msock < 0) {
+ if (ssock > 0) close (ssock);
+ lprintf(2, "inbetween.");
+ pthread_exit(NULL);
+ } else { // Got it? do some real work!