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

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