home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / LIBSRC.ZOO / libsrc / local / spawnve.c < prev    next >
Text File  |  1992-04-05  |  3KB  |  133 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.  
  9. int spawnve (int modeflag, char *path, char *argv[], char *envp[])
  10. {
  11.    int i;
  12.    ULONG rc;
  13.    int total_arg_length;
  14.    int total_env_length;
  15.    char *arg_strings;
  16.    char *env_strings;
  17.    char *ptr;
  18.    RESULTCODES ReturnCodes;
  19.    char ObjNameBuf[512];
  20.    char exe_name[512];
  21.  
  22.    strcpy (exe_name, path);
  23.  
  24.    if (strstr (exe_name, ".exe") == 0 && strstr (exe_name, ".EXE") == 0)
  25.       strcat (exe_name, ".EXE");
  26.  
  27.    /* construct the command args for DosExecPgm */
  28.  
  29.    if (argv) {
  30.       for (i = 0, total_arg_length = 1; argv[i]; ++i)
  31.          total_arg_length += strlen (argv[i]) + 1;
  32.  
  33.       arg_strings = (char *)malloc (total_arg_length);
  34.  
  35.       for (i = 0, ptr = arg_strings; argv[i]; ++i)
  36.       {
  37.          bcopy (argv[i], ptr, strlen (argv[i])+1);
  38.          ptr += strlen (argv[i]);
  39.          if (i == 0)
  40.             ptr++;
  41.          else
  42.             *ptr++ = ' ';
  43.       }
  44.  
  45.       *ptr = '\0';
  46.    } else {
  47.       arg_strings = (char *) malloc (2);
  48.       arg_strings[0] = '\0';
  49.       arg_strings[1] = '\0';
  50.    }
  51.  
  52.    if (envp) {
  53.       for (i = 0, total_env_length = 1; envp[i]; ++i)
  54.          total_env_length += strlen (envp[i]) + 1;
  55.  
  56.       env_strings = (char *)malloc (total_env_length);
  57.  
  58.       for (i = 0, ptr = env_strings; envp[i]; ++i)
  59.       {
  60.          char *tmpptr = ptr;
  61.          bcopy (envp[i], ptr, strlen (envp[i])+1);
  62.          while (*tmpptr != '=' && *tmpptr)
  63.          {
  64.             *tmpptr = toupper (*tmpptr);
  65.             ++tmpptr;
  66.          }
  67.          ptr += strlen (envp[i]) + 1;
  68.       }
  69.  
  70.       *ptr = '\0';
  71.    } else {
  72.       env_strings = 0;
  73.    }
  74.  
  75.    switch (modeflag)
  76.    {
  77.       case P_WAIT:    /* Wait for completion */
  78.          rc = Dos32ExecPgm (&ObjNameBuf[0],
  79.                             512,
  80.                             EXEC_SYNC,
  81.                             arg_strings,
  82.                             env_strings,
  83.                             &ReturnCodes,
  84.                             exe_name);
  85.  
  86.          if (rc)
  87.          {
  88.             if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
  89.             {
  90.                errno = ENOENT;
  91.                return (-1);
  92.             }
  93.  
  94.             errno = EIO;
  95.             return (-1);
  96.          }
  97.  
  98.          return (ReturnCodes.codeResult);
  99.          break;
  100.  
  101.       case P_NOWAIT:  /* Create a child and return */
  102.          rc = Dos32ExecPgm (&ObjNameBuf[0],
  103.                             512,
  104.                             EXEC_ASYNCRESULT,
  105.                             arg_strings,
  106.                             env_strings,
  107.                             &ReturnCodes,
  108.                             exe_name);
  109.  
  110.          if (rc)
  111.          {
  112.             if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
  113.             {
  114.                errno = ENOENT;
  115.                return (-1);
  116.             }
  117.  
  118.             errno = EIO;
  119.             return (-1);
  120.          }
  121.  
  122.          return (ReturnCodes.codeTerminate);
  123.          break;
  124.  
  125.       default:        /* oops... */
  126.          errno = EINVAL;
  127.          return (-1);
  128.          break;
  129.    }
  130. }
  131.  
  132.  
  133.