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