Diff for /libelwix/src/pio.c between versions 1.1.2.6 and 1.1.2.7

version 1.1.2.6, 2013/12/06 00:19:54 version 1.1.2.7, 2013/12/06 00:50:16
Line 63  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_I Line 63  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_I
  * @ppid = return pid of child program   * @ppid = return pid of child program
  * return: NULL error or !=NULL open program   * return: NULL error or !=NULL open program
  */   */
   #ifdef POPEN_STREAM
 FILE *  FILE *
   #else
   int
   #endif
 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, *p;          struct tagPIOPID *cur, *p;
         FILE *iop;  
         int pdes[2], pid, twoway, cloexec;          int pdes[2], pid, twoway, cloexec;
         char *argv[4];          char *argv[4];
   
         if (!command || !type)          if (!command || !type)
   #ifdef POPEN_STREAM
                 return NULL;                  return NULL;
   #else
                   return -1;
   #endif
   
         cloexec = strchr(type, 'e') != NULL;          cloexec = strchr(type, 'e') != NULL;
         /*          /*
Line 82  e_popen(const char *command, const char *type, pid_t * Line 89  e_popen(const char *command, const char *type, pid_t *
         if (strchr(type, '+')) {          if (strchr(type, '+')) {
                 twoway = 1;                  twoway = 1;
                 type = "r+";                  type = "r+";
        } else  {        } else {
                 twoway = 0;                  twoway = 0;
                if ((*type != 'r' && *type != 'w') ||                if ((*type != 'r' && *type != 'w') || 
                    (type[1] && (type[1] != 'e' || type[2])))                                (type[1] && (type[1] != 'e' || type[2])))
                        return (NULL);#ifdef POPEN_STREAM
                         return NULL;
 #else
                         return -1;
 #endif
         }          }
         if (socketpair(AF_UNIX, SOCK_STREAM | (cloexec ? O_CLOEXEC : 0),           if (socketpair(AF_UNIX, SOCK_STREAM | (cloexec ? O_CLOEXEC : 0), 
                                 0, pdes) < 0) {                                  0, pdes) < 0) {
                 LOGERR;                  LOGERR;
                return (NULL);#ifdef POPEN_STREAM
                 return NULL;
 #else
                 return -1;
 #endif
         }          }
   
         if (!(cur = e_malloc(sizeof(struct tagPIOPID)))) {          if (!(cur = e_malloc(sizeof(struct tagPIOPID)))) {
                 close(pdes[0]);                  close(pdes[0]);
                 close(pdes[1]);                  close(pdes[1]);
                return (NULL);#ifdef POPEN_STREAM
                 return NULL;
 #else
                 return -1;
 #endif
         }          }
   
         argv[0] = "sh";          argv[0] = "sh";
Line 113  e_popen(const char *command, const char *type, pid_t * Line 132  e_popen(const char *command, const char *type, pid_t *
                 close(pdes[0]);                  close(pdes[0]);
                 close(pdes[1]);                  close(pdes[1]);
                 e_free(cur);                  e_free(cur);
                return (NULL);#ifdef POPEN_STREAM
                 return NULL;
 #else
                 return -1;
 #endif
                 /* NOTREACHED */                  /* NOTREACHED */
         case 0:                         /* Child. */          case 0:                         /* Child. */
                 if (*type == 'r') {                  if (*type == 'r') {
Line 150  e_popen(const char *command, const char *type, pid_t * Line 173  e_popen(const char *command, const char *type, pid_t *
                                 close(pdes[1]);                                  close(pdes[1]);
                 }                  }
                 SLIST_FOREACH(p, &pio_pidlist, next)                  SLIST_FOREACH(p, &pio_pidlist, next)
                        close(fileno(p->fp));#ifdef POPEN_STREAM
                         close(fileno(p->f.fp));
 #else
                         close(p->f.fd);
 #endif
                 execve(_PATH_BSHELL, argv, environ);                  execve(_PATH_BSHELL, argv, environ);
                 _exit(127);                  _exit(127);
                 /* NOTREACHED */                  /* NOTREACHED */
Line 162  e_popen(const char *command, const char *type, pid_t * Line 189  e_popen(const char *command, const char *type, pid_t *
   
         /* Parent; assume fdopen can't fail. */          /* Parent; assume fdopen can't fail. */
         if (*type == 'r') {          if (*type == 'r') {
                iop = fdopen(pdes[0], type);#ifdef POPEN_STREAM
                 cur->f.fp = fdopen(pdes[0], type);
 #else
                 cur->f.fd = pdes[0];
 #endif
                 close(pdes[1]);                  close(pdes[1]);
         } else {          } else {
                iop = fdopen(pdes[1], type);#ifdef POPEN_STREAM
                 cur->f.fp = fdopen(pdes[1], type);
 #else
                 cur->f.fd = pdes[1];
 #endif
                 close(pdes[0]);                  close(pdes[0]);
         }          }
   
         /* Link into list of file descriptors. */          /* Link into list of file descriptors. */
         cur->fp = iop;  
         cur->pid = pid;          cur->pid = pid;
         THREAD_LOCK();          THREAD_LOCK();
         SLIST_INSERT_HEAD(&pio_pidlist, cur, next);          SLIST_INSERT_HEAD(&pio_pidlist, cur, next);
         THREAD_UNLOCK();          THREAD_UNLOCK();
   
        return (iop);#ifdef POPEN_STREAM
         return cur->f.fp;
 #else
         return cur->f.fd;
 #endif
 }  }
   
 /*  /*
Line 186  e_popen(const char *command, const char *type, pid_t * Line 224  e_popen(const char *command, const char *type, pid_t *
  * return: -1 error or !=-1 pid status   * return: -1 error or !=-1 pid status
  */   */
 int  int
   #ifdef POPEN_STREAM
 e_pclose(FILE *iop)  e_pclose(FILE *iop)
   #else
   e_pclose(int iop)
   #endif
 {  {
         struct tagPIOPID *cur, *last = NULL;          struct tagPIOPID *cur, *last = NULL;
         int pstat;          int pstat;
Line 200  e_pclose(FILE *iop) Line 242  e_pclose(FILE *iop)
          */           */
         THREAD_LOCK();          THREAD_LOCK();
         SLIST_FOREACH(cur, &pio_pidlist, next) {          SLIST_FOREACH(cur, &pio_pidlist, next) {
                if (cur->fp == iop)#ifdef POPEN_STREAM
                 if (cur->f.fp == iop)
 #else
                 if (cur->f.fd == iop)
 #endif
                         break;                          break;
                 last = cur;                  last = cur;
         }          }
Line 214  e_pclose(FILE *iop) Line 260  e_pclose(FILE *iop)
                 SLIST_REMOVE_AFTER(last, next);                  SLIST_REMOVE_AFTER(last, next);
         THREAD_UNLOCK();          THREAD_UNLOCK();
   
   #ifdef POPEN_STREAM
         fclose(iop);          fclose(iop);
   #else
           close(iop);
   #endif
   
         do {          do {
                 pid = wait4(cur->pid, &pstat, 0, NULL);                  pid = wait4(cur->pid, &pstat, 0, NULL);
Line 232  e_pclose(FILE *iop) Line 282  e_pclose(FILE *iop)
  * return: NULL error or !=NULL tagPIOPID structure   * return: NULL error or !=NULL tagPIOPID structure
  */   */
 struct tagPIOPID *  struct tagPIOPID *
pio_pgetpid(FILE * __restrict iop)#ifdef POPEN_STREAM
 pio_pgetpid(FILE *iop)
 #else
 pio_pgetpid(int iop)
 #endif
 {  {
         struct tagPIOPID *p;          struct tagPIOPID *p;
   
Line 241  pio_pgetpid(FILE * __restrict iop) Line 295  pio_pgetpid(FILE * __restrict iop)
   
         THREAD_LOCK();          THREAD_LOCK();
         SLIST_FOREACH(p, &pio_pidlist, next)          SLIST_FOREACH(p, &pio_pidlist, next)
                if (p->fp == iop)#ifdef POPEN_STREAM
                 if (p->f.fp == iop)
 #else
                 if (p->f.fd == iop)
 #endif
                         break;                          break;
         THREAD_UNLOCK();          THREAD_UNLOCK();
   
Line 271  pio_pchkpid(array_t ** __restrict pids) Line 329  pio_pchkpid(array_t ** __restrict pids)
   
         THREAD_LOCK();          THREAD_LOCK();
         SLIST_FOREACH(p, &pio_pidlist, next)          SLIST_FOREACH(p, &pio_pidlist, next)
                if (p->fp && waitpid(p->pid, &p->stat, WNOHANG) > 0) {#ifdef POPEN_STREAM
                 if (p->f.fp && waitpid(p->pid, &p->stat, WNOHANG) > 0) {
 #else
                 if (p->f.fd && waitpid(p->pid, &p->stat, WNOHANG) > 0) {
 #endif
                         if (pids)                          if (pids)
                                 array_Push(pa, p, 0);                                  array_Push(pa, p, 0);
                         ret++;                          ret++;

Removed from v.1.1.2.6  
changed lines
  Added in v.1.1.2.7


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