home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
LIBSRC.ZOO
/
libsrc
/
local
/
spawnve.c
< prev
next >
Wrap
Text File
|
1992-04-05
|
3KB
|
133 lines
#define INCL_DOSPROCESS
#define INCL_DOSERRORS
#include <os2.h>
#include <errno.h>
#include <process.h>
ULONG Dos32ExecPgm() asm ("Dos32ExecPgm");
int spawnve (int modeflag, char *path, char *argv[], char *envp[])
{
int i;
ULONG rc;
int total_arg_length;
int total_env_length;
char *arg_strings;
char *env_strings;
char *ptr;
RESULTCODES ReturnCodes;
char ObjNameBuf[512];
char exe_name[512];
strcpy (exe_name, path);
if (strstr (exe_name, ".exe") == 0 && strstr (exe_name, ".EXE") == 0)
strcat (exe_name, ".EXE");
/* construct the command args for DosExecPgm */
if (argv) {
for (i = 0, total_arg_length = 1; argv[i]; ++i)
total_arg_length += strlen (argv[i]) + 1;
arg_strings = (char *)malloc (total_arg_length);
for (i = 0, ptr = arg_strings; argv[i]; ++i)
{
bcopy (argv[i], ptr, strlen (argv[i])+1);
ptr += strlen (argv[i]);
if (i == 0)
ptr++;
else
*ptr++ = ' ';
}
*ptr = '\0';
} else {
arg_strings = (char *) malloc (2);
arg_strings[0] = '\0';
arg_strings[1] = '\0';
}
if (envp) {
for (i = 0, total_env_length = 1; envp[i]; ++i)
total_env_length += strlen (envp[i]) + 1;
env_strings = (char *)malloc (total_env_length);
for (i = 0, ptr = env_strings; envp[i]; ++i)
{
char *tmpptr = ptr;
bcopy (envp[i], ptr, strlen (envp[i])+1);
while (*tmpptr != '=' && *tmpptr)
{
*tmpptr = toupper (*tmpptr);
++tmpptr;
}
ptr += strlen (envp[i]) + 1;
}
*ptr = '\0';
} else {
env_strings = 0;
}
switch (modeflag)
{
case P_WAIT: /* Wait for completion */
rc = Dos32ExecPgm (&ObjNameBuf[0],
512,
EXEC_SYNC,
arg_strings,
env_strings,
&ReturnCodes,
exe_name);
if (rc)
{
if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
{
errno = ENOENT;
return (-1);
}
errno = EIO;
return (-1);
}
return (ReturnCodes.codeResult);
break;
case P_NOWAIT: /* Create a child and return */
rc = Dos32ExecPgm (&ObjNameBuf[0],
512,
EXEC_ASYNCRESULT,
arg_strings,
env_strings,
&ReturnCodes,
exe_name);
if (rc)
{
if (rc == ERROR_FILE_NOT_FOUND || rc == ERROR_PATH_NOT_FOUND)
{
errno = ENOENT;
return (-1);
}
errno = EIO;
return (-1);
}
return (ReturnCodes.codeTerminate);
break;
default: /* oops... */
errno = EINVAL;
return (-1);
break;
}
}