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

version 1.1.2.1, 2013/12/05 14:56:42 version 1.1.2.3, 2013/12/05 15:13:58
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;  
   
           if (!command || !type)
                   return NULL;
   
         cloexec = strchr(type, 'e') != NULL;          cloexec = strchr(type, 'e') != NULL;
         /*          /*
          * Lite2 introduced two-way popen() pipes using _socketpair().           * Lite2 introduced two-way popen() pipes using _socketpair().
Line 44  e_popen(const char *command, const char *type, pid_t * Line 46  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 139  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;
   
           if (!iop)
                   return -1;
   
         /*          /*
          * Find the appropriate file pointer and remove it from the list.           * Find the appropriate file pointer and remove it from the list.
          */           */
Line 150  e_pclose(FILE *iop) Line 155  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 168  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);
   
         return (pid == -1 ? -1 : pstat);          return (pid == -1 ? -1 : pstat);
   }
   
   /*
    * pio_pgetpid() - Get tagPIOPID structure from file handle
    *
    * @iop = popen handle
    * return: NULL error or !=NULL tagPIOPID structure
    */
   struct tagPIOPID *
   pio_pgetpid(FILE * __restrict iop)
   {
           struct tagPIOPID *p;
   
           if (!iop)
                   return NULL;
   
           THREAD_LOCK();
           SLIST_FOREACH(p, &pio_pidlist, next)
                   if (p->fp == iop)
                           break;
           THREAD_UNLOCK();
   
           return p;
 }  }

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


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