Diff for /libelwix/src/pio.c between versions 1.6 and 1.8

version 1.6, 2019/12/30 18:11:16 version 1.8, 2020/06/19 23:07:20
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004 - 2015Copyright 2004 - 2020
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 65  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_I Line 65  static pthread_mutex_t pidlist_mutex = PTHREAD_MUTEX_I
  * @command = command   * @command = command
  * @type = type   * @type = type
  * @ppid = return pid of child program   * @ppid = return pid of child program
    *      If value of *ppid is -1 when invoke routine then child will be session leader
  * return: NULL error or !=NULL open program   * return: NULL error or !=NULL open program
  */   */
 #ifdef POPEN_STREAM  #ifdef POPEN_STREAM
Line 74  int Line 75  int
 #endif  #endif
 e_popen(const char *command, const char *type, pid_t *ppid)  e_popen(const char *command, const char *type, pid_t *ppid)
 {  {
           return e_popen2(command, type, ppid, NULL, 0);
   }
   
   /*
    * e_popen2() - ELWIX replacement of standard popen with post close of chosen handles
    *
    * @command = command
    * @type = type
    * @ppid = return pid of child program 
    *      If value of *ppid is -1 when invoke routine then child will be session leader
    * @fds = file descriptor array for close when fork
    * @fdslen = fds number of descriptors
    * return: NULL error or !=NULL open program
    */
   #ifdef POPEN_STREAM
   FILE *
   #else
   int
   #endif
   e_popen2(const char *command, const char *type, pid_t *ppid, int *fds, size_t fdslen)
   {
         struct tagPIOPID *cur, *p;          struct tagPIOPID *cur, *p;
        int pdes[2], pid, twoway, cloexec;        int pdes[2], pid, twoway, cloexec, i;
         char *argv[4];          char *argv[4];
   
         if (!command || !type)          if (!command || !type)
Line 143  e_popen(const char *command, const char *type, pid_t * Line 165  e_popen(const char *command, const char *type, pid_t *
 #endif  #endif
                 /* NOTREACHED */                  /* NOTREACHED */
         case 0:                         /* Child. */          case 0:                         /* Child. */
                   if (ppid && *ppid == -1)
                           setsid();
   
                   if (fds && fdslen) {
                           for (i = 0; i < fdslen; i++)
                                   close(fds[i]);
                   }
   
                 if (*type == 'r') {                  if (*type == 'r') {
                         /*                          /*
                          * The _dup2() to STDIN_FILENO is repeated to avoid                           * The _dup2() to STDIN_FILENO is repeated to avoid

Removed from v.1.6  
changed lines
  Added in v.1.8


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