1 /* Gateway Resource Monitor
5 * Revision 1.3 1995/05/02 07:20:10 adam
6 * Use pid of exited child to close fifos.
8 * Revision 1.2 1995/05/01 16:26:57 adam
9 * More work on resource monitor.
11 * Revision 1.1 1995/05/01 12:43:36 adam
12 * First work on resource monitor program.
28 #include <sys/types.h>
40 static char *module = "monitor";
41 static jmp_buf retry_jmp;
47 struct str_queue *queue;
51 struct ke_info *ke_info_list = NULL;
53 struct ke_info *ke_info_add (int id)
57 for (kip = &ke_info_list; *kip; kip= &(*kip)->next)
60 *kip = malloc (sizeof(**kip));
65 if (!((*kip)->queue = str_queue_mk ()))
67 gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, module, "str_queue_mk");
73 void ke_info_del (void)
77 assert (ke_info_list);
79 str_queue_rm (&ki->queue);
80 ke_info_list = ki->next;
84 static void catchchild (int num)
89 while ((pid=waitpid (-1, 0, WNOHANG)) > 0)
90 for (ki = ke_info_list; ki; ki = ki->next)
93 gw_log (GW_LOG_DEBUG, module, "Close of %d", ki->id);
97 gipc_destroy (ki->gip);
101 signal (SIGCHLD, catchchild);
104 static void pipe_handle (int dummy)
106 longjmp (retry_jmp, 1);
109 static pid_t start_kernel (int argc, char **argv, int id)
114 char userid_option[20];
116 argv_p = malloc (sizeof(*argv_p)*(argc+2));
119 gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, module, "malloc fail");
122 argv_p[0] = "kernel";
123 for (i = 1; i<argc; i++)
125 sprintf (userid_option, "-i%d", id);
126 argv_p[i++] = userid_option;
129 gw_log (GW_LOG_DEBUG, module, "Starting kernel");
133 gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, module, "fork");
138 execv ("kernel", argv_p);
139 gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, module, "execvp");
145 static void deliver (int argc, char **argv, int id, struct str_queue *queue,
146 GIP *gip, pid_t *pidp)
151 char fifo_server_name[128];
152 char fifo_client_name[128];
156 sprintf (fifo_server_name, "fifo.s.%d", id);
157 sprintf (fifo_client_name, "fifo.c.%d", id);
161 *gip = gipc_initialize (fifo_client_name);
163 oldsig = signal (SIGPIPE, pipe_handle);
167 r = gipc_open (*gip, fifo_server_name, 0);
172 mknod (fifo_server_name, S_IFIFO|0666, 0);
173 pid = start_kernel (argc, argv, id);
176 r = gipc_open (*gip, fifo_server_name, 1);
180 gw_log (GW_LOG_WARN, module, "Cannot start kernel");
187 gw_log (GW_LOG_DEBUG|GW_LOG_ERRNO, module, "r==-2");
188 longjmp (retry_jmp, 1);
192 gw_log (GW_LOG_DEBUG|GW_LOG_ERRNO, module, "r==-1");
193 longjmp (retry_jmp, 1);
197 gw_log (GW_LOG_WARN|GW_LOG_ERRNO, module, "gipc_open");
202 while ((msg = str_queue_get (queue, index++)))
203 gip_wline (*gip, msg);
204 signal (SIGPIPE, oldsig);
207 static void monitor_events (int argc, char **argv)
213 char command[128], *cp;
217 gip_m = gips_initialize ("fifo.s");
218 r = gips_open (gip_m, "fifo.c");
219 gip_m_fd = gip_infileno (gip_m);
220 open ("fifo.s", O_WRONLY);
230 FD_SET (gip_m_fd, &set_r);
231 gw_log (GW_LOG_DEBUG, module, "set r %d", gip_m_fd);
234 for (ki = ke_info_list; ki; ki = ki->next)
238 gw_log (GW_LOG_DEBUG, module, "Transfer mail to %d", ki->id);
239 deliver (argc, argv, ki->id, ki->queue, &ki->gip, &ki->pid);
240 str_queue_rm (&ki->queue);
242 for (ki = ke_info_list; ki; ki = ki->next)
245 if (ki->gip && (fd = gip_infileno (ki->gip)) != -1)
247 gw_log (GW_LOG_DEBUG, module, "set r %d", fd);
253 gw_log (GW_LOG_DEBUG, module, "IPC select");
254 r = select (fd_max+1, &set_r, NULL, NULL, NULL);
259 gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, module, "select");
262 gw_log (GW_LOG_DEBUG|GW_LOG_ERRNO, module, "select");
264 gw_log (GW_LOG_DEBUG, module, "Testing ke_info_list");
265 for (ki = ke_info_list; ki; ki = ki->next)
268 if (ki->gip && (fd = gip_infileno (ki->gip)) != -1)
270 gw_log (GW_LOG_DEBUG, module, "Test of %d", fd);
271 if (FD_ISSET (fd, &set_r))
273 if (lgets (line_buf, sizeof(line_buf)-1, fd))
275 gw_log (GW_LOG_DEBUG, module, "IPC: %s", line_buf);
279 gw_log (GW_LOG_DEBUG, module, "Close of %d", ki->id);
280 gipc_close (ki->gip);
281 gipc_destroy (ki->gip);
288 gw_log (GW_LOG_DEBUG, module, "Testing gip_m_fd %d", gip_m_fd);
289 if (FD_ISSET (gip_m_fd, &set_r))
291 gw_log (GW_LOG_DEBUG, module, "Reading from %d", gip_m_fd);
292 if (!(lgets (command, sizeof(command)-1, gip_m_fd)))
294 gw_log (GW_LOG_FATAL, module, "Unexpected close");
297 gw_log (GW_LOG_DEBUG, module, "Done");
298 if ((cp = strchr (command, '\n')))
300 gw_log (GW_LOG_DEBUG, module, "IPC: %s", command);
301 if (!memcmp (command, "eti ", 4))
303 int id = atoi (command+4);
304 struct ke_info *new_k;
306 new_k = ke_info_add (id);
307 gw_log (GW_LOG_DEBUG, module, "Incoming mail %d", id);
308 str_queue_enq (new_k->queue, "mail\n");
309 while (lgets (line_buf, sizeof(line_buf)-1, gip_m_fd))
310 str_queue_enq (new_k->queue, line_buf);
311 str_queue_enq (new_k->queue, "\001");
317 int main (int argc, char **argv)
320 gw_log_level (GW_LOG_ALL);
321 signal (SIGCHLD, catchchild);
323 gw_log_file (GW_LOG_ALL, "monitor.log");
325 monitor_events (argc, argv);