10 * wait for read-select on some sockets, or for time to pass
11 * or for a process to exit.
12 * when one of these happens, we check with each service to see
13 * if it wants to do something.
15 * services ask to do something with
18 * and can check is a socket is read with
24 static fd_set wait_for, are_ready;
25 static fd_set write_on, can_write;
26 static time_t when_wake;
28 void listenon(int socket)
30 FD_SET(socket, &wait_for);
33 int readyon(int socket)
35 return FD_ISSET(socket, &are_ready);
38 void writeon(int socket)
40 FD_SET(socket, &write_on);
45 int canwrite(int socket)
47 return FD_ISSET(socket, &can_write);
50 void waituntil(time_t when)
52 if (when_wake == 0 || when_wake > when) when_wake = when;
60 } saved_pids[20] = { { 0 } };
62 static struct timeval select_tv;
63 static void collectchild()
68 if ((pid = waitpid(-1, &status, WNOHANG)) > 0)
72 if (saved_pids[i].pid == 0)
74 saved_pids[i].pid = pid;
75 saved_pids[i].status = status;
76 time(&saved_pids[i].time);
80 select_tv.tv_usec = 0;
84 int is_saved_pid(pid_t pid)
88 if (saved_pids[i].pid == pid)
97 sa.sa_handler = collectchild;
100 sigaddset(&ss, SIGCLD);
102 sigaction(SIGCLD, &sa, NULL);
112 when_wake = time(0)+5*60; /* always wakeup every 5minutes to look around... */
113 collectchild(); /* incase signal was missed */
115 for (i=0 ; i<20 ; i++)
116 if (saved_pids[i].pid)
119 pp = skip_search(allprocs, &saved_pids[i].pid);
122 (*pp)->status = saved_pids[i].status;
123 (*pp)->exit_time = saved_pids[i].time;;
124 select_tv.tv_sec = 0;
125 logmsg(LOG_INFO, "process %d (%s) exited - status 0x%04x", saved_pids[i].pid, (*pp)->service->service, (*pp)->status);
127 logmsg(LOG_INFO, "process %d exited - status 0x%04x", saved_pids[i].pid, saved_pids[i].status);
128 saved_pids[i].pid = 0;
132 for (svp = skip_first(services) ; svp ; svp = skip_next(svp))
135 are_ready = wait_for;
136 can_write = write_on;
142 select_tv.tv_sec = when_wake - now;
143 select_tv.tv_usec = 0;
144 if (when_wake < now) select_tv.tv_sec = 0;
148 select_tv.tv_sec = 100000;
149 select_tv.tv_usec = 0;
151 if (select(FD_SETSIZE, &are_ready, &can_write, NULL, &select_tv) <= 0)