3 * load process state from a file.
4 * when metad reruns itself, it saves state in the form
6 * we now read that it and add proc entries as appropriate
12 #include <sys/fcntl.h>
23 void loadstate(int fd)
25 int len = lseek(fd, 0, 2);
30 buf = (char*)malloc(len);
35 if (get_byte() != 3) return; /* something VERY wrong */
37 while ( b==1 || b == 2) { /* service */
43 service_t sv, *svp = NULL;
47 svp = skip_search(services, sname);
51 qfree(get_str()); /* home */
52 qfree(get_str()); /* user */
53 qfree(get_str()); /* crash */
55 get_int(); /* watch_output */
56 qfree(get_str()); /* pidfile */
60 qfree(get_str()); /* prog */
78 if (svp) sv= *svp ;else sv= NULL;
79 if (sv) sv->enabled = enabled;
81 while (b == 3 || b == 4) { /* process */
84 int forkedpid = 0, pipefd = -1;
87 forkedpid = get_int();
91 start = get_int(); /* start */
94 get_int(); /* status */
95 if ((sv && (xit == 0 && kill(pid, 0)==0)) ||
96 (xit>0 && forkedpid>0 && kill(forkedpid,0)==0) ) {
97 proc_t p = (proc_t)malloc(sizeof(struct proc));
102 p->it_forked = forkedpid;
104 p->start_time = start;
105 p->hold_time = xit?1:0;
107 skip_insert(sv->proc_list, p);
108 skip_insert(allprocs, p);
123 char *file = "/var/tmp/...metad-temp-file";
125 fd = open(file, O_RDWR|O_TRUNC|O_CREAT, 0600);
128 execv(gargv[2], gargv);
133 send_byte(3); /* listing */
134 for (svp = skip_first(services) ; svp ; svp = skip_next(svp)) {
137 send_byte(0); /* finished */
139 buf = get_return(&len);
146 gargv[0] = "metad-restart";
147 execv(gargv[2], gargv);