home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / LIBSRC.ZOO / libsrc / local / spawnvpe.c < prev    next >
Text File  |  1992-04-05  |  4KB  |  164 lines

  1. #define INCL_DOSPROCESS
  2. #define INCL_DOSERRORS
  3. #include <os2.h>
  4. #include <errno.h>
  5. #include <process.h>
  6.  
  7. ULONG Dos32ExecPgm() asm ("Dos32ExecPgm");
  8. ULONG Dos32SearchPath() asm ("Dos32SearchPath");
  9.  
  10. int spawnvpe (int modeflag, char *path, char *argv[], char *envp[])
  11. {
  12.    int i;
  13.    ULONG rc;
  14.    int total_arg_length;
  15.    int total_env_length;
  16.    char *arg_strings;
  17.    char *env_strings;
  18.    char *ptr;
  19.    RESULTCODES ReturnCodes;
  20.    char ObjNameBuf[512];
  21.    char exe_name[512];
  22.    char *base_name[512];
  23.  
  24.    /* Try to find the .EXE file */
  25.  
  26.    strcpy ((char *)base_name, path);
  27.  
  28.    rc = Dos32SearchPath (SEARCH_ENVIRONMENT | SEARCH_CUR_DIRECTORY,
  29.                                          (PSZ) "PATH",
  30.                                          (PSZ) base_name,
  31.                                          (PBYTE) exe_name,
  32.                                          512);
  33.  
  34.    if (rc)
  35.    {
  36.       strcat (base_name, ".EXE");
  37.  
  38.       rc = Dos32SearchPath (SEARCH_ENVIRONMENT | SEARCH_CUR_DIRECTORY,
  39.                                             (PSZ) "PATH",
  40.                                             (PSZ) base_name,
  41.                                             (PBYTE) exe_name,
  42.                                             512);
  43.  
  44.       if (rc)
  45.       {
  46.          if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
  47.          {
  48.             errno = ENOENT;
  49.             return (-1);
  50.          }
  51.  
  52.          errno = EIO;
  53.          return (-1);
  54.       }
  55.    }
  56.  
  57.    /* construct the command args for DosExecPgm */
  58.  
  59.    if (argv) {
  60.       for (i = 0, total_arg_length = 1; argv[i]; ++i)
  61.          total_arg_length += strlen (argv[i]) + 1;
  62.  
  63.       arg_strings = (char *)malloc (total_arg_length);
  64.  
  65.       for (i = 0, ptr = arg_strings; argv[i]; ++i)
  66.       {
  67.          bcopy (argv[i], ptr, strlen (argv[i])+1);
  68.          ptr += strlen (argv[i]);
  69.          if (i == 0)
  70.             ptr++;
  71.          else
  72.             *ptr++ = ' ';
  73.       }
  74.  
  75.       *ptr = '\0';
  76.    } else {
  77.       arg_strings = (char *) malloc (2);
  78.       arg_strings[0] = '\0';
  79.       arg_strings[1] = '\0';
  80.    }
  81.  
  82.    if (envp) {
  83.       for (i = 0, total_env_length = 1; envp[i]; ++i)
  84.          total_env_length += strlen (envp[i]) + 1;
  85.  
  86.       env_strings = (char *)malloc (total_env_length);
  87.  
  88.       for (i = 0, ptr = env_strings; envp[i]; ++i)
  89.       {
  90.          char *tmpptr = ptr;
  91.          bcopy (envp[i], ptr, strlen (envp[i])+1);
  92.          while (*tmpptr != '=' && *tmpptr)
  93.          {
  94.             *tmpptr = toupper (*tmpptr);
  95.             ++tmpptr;
  96.          }
  97.          ptr += strlen (envp[i]) + 1;
  98.       }
  99.  
  100.       *ptr = '\0';
  101.    } else {
  102.       env_strings = 0;
  103.    }
  104.  
  105.    switch (modeflag)
  106.    {
  107.       case P_WAIT:    /* Wait for completion */
  108.          rc = Dos32ExecPgm (&ObjNameBuf[0],
  109.                             512,
  110.                             EXEC_SYNC,
  111.                             arg_strings,
  112.                             env_strings,
  113.                             &ReturnCodes,
  114.                             exe_name);
  115.  
  116.          if (rc)
  117.          {
  118.             if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
  119.             {
  120.                errno = ENOENT;
  121.                return (-1);
  122.             }
  123.  
  124.             errno = EIO;
  125.             return (-1);
  126.          }
  127.  
  128.          return (ReturnCodes.codeResult);
  129.          break;
  130.  
  131.       case P_NOWAIT:  /* Create a child and return */
  132.          rc = Dos32ExecPgm (&ObjNameBuf[0],
  133.                             512,
  134.                             EXEC_ASYNCRESULT,
  135.                             arg_strings,
  136.                             env_strings,
  137.                             &ReturnCodes,
  138.                             exe_name);
  139.  
  140.          if (rc)
  141.          {
  142.             if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
  143.             {
  144.                errno = ENOENT;
  145.                return (-1);
  146.             }
  147.  
  148.             errno = EIO;
  149.             return (-1);
  150.          }
  151.  
  152.          return (ReturnCodes.codeTerminate);
  153.          break;
  154.  
  155.       default:        /* oops... */
  156.          errno = EINVAL;
  157.          return (-1);
  158.          break;
  159.    }
  160. }
  161.  
  162.  
  163.  
  164.