Diff for /libelwix/src/pio.c between versions 1.1.2.1 and 1.1.2.2

version 1.1.2.1, 2013/12/05 14:56:42 version 1.1.2.2, 2013/12/05 15:04:20
Line 3 Line 3
   
 extern char **environ;  extern char **environ;
   
pio_pid_t pio_pidlist = = SLIST_HEAD_INITIALIZER(pio_pidlist);pio_pid_t pio_pidlist = SLIST_HEAD_INITIALIZER(pio_pidlist);
 static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_INITIALIZER;  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_INITIALIZER;
   
 #define THREAD_LOCK()   if (__isthreaded) pthread_mutex_lock(&pidlist_mutex)  #define THREAD_LOCK()   if (__isthreaded) pthread_mutex_lock(&pidlist_mutex)
Line 21  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_I Line 21  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_I
 FILE *  FILE *
 e_popen(const char *command, const char *type, pid_t *ppid)  e_popen(const char *command, const char *type, pid_t *ppid)
 {  {
        struct tagPIOPID *cur;        struct tagPIOPID *cur, *p;
         FILE *iop;          FILE *iop;
         int pdes[2], pid, twoway, cloexec;          int pdes[2], pid, twoway, cloexec;
         char *argv[4];          char *argv[4];
         struct pid *p;  
   
         cloexec = strchr(type, 'e') != NULL;          cloexec = strchr(type, 'e') != NULL;
         /*          /*
Line 44  e_popen(const char *command, const char *type, pid_t * Line 43  e_popen(const char *command, const char *type, pid_t *
         if ((cloexec ? pipe2(pdes, O_CLOEXEC) : pipe(pdes)) < 0)          if ((cloexec ? pipe2(pdes, O_CLOEXEC) : pipe(pdes)) < 0)
                 return (NULL);                  return (NULL);
   
        if ((cur = e_malloc(sizeof(struct pid))) == NULL) {        if (!(cur = e_malloc(sizeof(struct tagPIOPID)))) {
                 close(pdes[0]);                  close(pdes[0]);
                 close(pdes[1]);                  close(pdes[1]);
                 return (NULL);                  return (NULL);
Line 137  e_popen(const char *command, const char *type, pid_t * Line 136  e_popen(const char *command, const char *type, pid_t *
 int  int
 e_pclose(FILE *iop)  e_pclose(FILE *iop)
 {  {
        struct pid *cur, *last = NULL;        struct tagPIOPID *cur, *last = NULL;
         int pstat;          int pstat;
         pid_t pid;          pid_t pid;
   
Line 150  e_pclose(FILE *iop) Line 149  e_pclose(FILE *iop)
                         break;                          break;
                 last = cur;                  last = cur;
         }          }
        if (cur == NULL) {        if (!cur) {
                 THREAD_UNLOCK();                  THREAD_UNLOCK();
                 return (-1);                  return (-1);
         }          }
        if (last == NULL)        if (!last)
                 SLIST_REMOVE_HEAD(&pio_pidlist, next);                  SLIST_REMOVE_HEAD(&pio_pidlist, next);
         else          else
                 SLIST_REMOVE_AFTER(last, next);                  SLIST_REMOVE_AFTER(last, next);
Line 163  e_pclose(FILE *iop) Line 162  e_pclose(FILE *iop)
         fclose(iop);          fclose(iop);
   
         do {          do {
                pid = wait4(cur->pid, &pstat, 0, (struct rusage *)0);                pid = wait4(cur->pid, &pstat, 0, NULL);
         } while (pid == -1 && errno == EINTR);          } while (pid == -1 && errno == EINTR);
   
         e_free(cur);          e_free(cur);

Removed from v.1.1.2.1  
changed lines
  Added in v.1.1.2.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>