#include "lib.h" #include #include #include #include #include #include #include "sys9.h" <<<<<<< wait.c.orig ======= /* ** PID cache */ typedef struct wdesc wdesc; struct wdesc { pid_t w_pid; Waitmsg *w_msg; wdesc *w_next; }; static wdesc *wd = 0; static Waitmsg * lookpid (pid_t pid) { wdesc **wp0 = &wd, *wp; Waitmsg *msg; if (pid == -1) { if (wd == 0) return 0; pid = wd->w_pid; } for (wp = wd; wp; wp = wp->w_next) { if (wp->w_pid == pid) { msg = wp->w_msg; *wp0 = wp->w_next; free (wp); return msg; } wp0 = &(wp->w_next); } return 0; } static void addpid (Waitmsg *msg) { wdesc *wp = malloc (sizeof (wdesc)); wp->w_msg = msg; wp->w_pid = msg->pid; wp->w_next = wd; wd = wp; } pid_t wait (int *status) { return wait4(-1, status, 0, 0); } >>>>>>> wait.c pid_t <<<<<<< wait.c.orig wait(int *stat_loc) { return waitpid(-1, stat_loc, 0); ======= waitpid (pid_t wpid, int *status, int options) { return wait4(wpid, status, options, 0); >>>>>>> wait.c } pid_t <<<<<<< wait.c.orig waitpid(int pid, int *stat_loc, int options) { int n, i, wfd, r, t, wpid; char *bp, *ep, pname[50]; struct stat buf; ======= wait3 (int *status, int options, Waitmsg *waitmsg) { return wait4(-1, status, options, waitmsg); } pid_t wait4 (pid_t wpid, int *status, int options, Waitmsg *waitmsg) { >>>>>>> wait.c Waitmsg *w; <<<<<<< wait.c.orig if(options&WNOHANG){ sprintf(pname, "/proc/%d/wait", getpid()); i = stat(pname, &buf); if(i >=0 && buf.st_size==0) ======= if (options & WNOHANG) { char pname[128]; int i; struct stat buf; snprintf (pname, sizeof (pname), "/proc/%d/wait", getpid()); i = stat (pname, &buf); if (i >= 0 && buf.st_size == 0) >>>>>>> wait.c return 0; } <<<<<<< wait.c.orig n = 0; while(n==0){ w = _WAIT(); if(w == 0){ _syserrno(); n = -1; }else{ ======= if (w = lookpid (wpid)) { waitmsg = w; wpid = w->pid; return wpid; } w = _WAIT(); while (w) { if (wpid <= 0) { waitmsg = w; >>>>>>> wait.c wpid = w->pid; <<<<<<< wait.c.orig if(pid>0 && wpid!=pid){ free(w); continue; } n = wpid; if(stat_loc){ r = 0; t = 0; if(w->msg[0]){ ======= return wpid; } if (w->pid == wpid) { if (status) { int r = 0; int t = 0; char *bp, *ep; if (w->msg[0]) { >>>>>>> wait.c /* message is 'prog pid:string' */ bp = w->msg; <<<<<<< wait.c.orig while(*bp){ if(*bp++ == ':') ======= while (*bp) { if (*bp++ == ':') >>>>>>> wait.c break; } <<<<<<< wait.c.orig if(*bp == 0) ======= if (*bp == 0) >>>>>>> wait.c bp = w->msg; <<<<<<< wait.c.orig r = strtol(bp, &ep, 10); if(*ep == 0){ if(r < 0 || r >= 256) ======= r = strtol (bp, &ep, 10); if (*ep == 0) { if (r < 0 || r >= 256) >>>>>>> wait.c r = 1; <<<<<<< wait.c.orig }else{ t = _stringsig(bp); if(t == 0) ======= } else { t = _stringsig (bp); if (t == 0) >>>>>>> wait.c r = 1; } } <<<<<<< wait.c.orig *stat_loc = (r << 8) | t; ======= *status = (r << 8) | t; >>>>>>> wait.c } <<<<<<< wait.c.orig free(w); ======= waitmsg = w; wpid = w->pid; return wpid; } else { addpid (w); >>>>>>> wait.c } <<<<<<< wait.c.orig ======= w = _WAIT(); } if (w == 0) { _syserrno (); >>>>>>> wait.c } <<<<<<< wait.c.orig return n; ======= >>>>>>> wait.c } <<<<<<< wait.c.orig ======= >>>>>>> wait.c