mirror of
https://github.com/reactos/reactos.git
synced 2024-08-08 04:08:29 +00:00
Merged all exec* and spawn* functions in one source file.
svn path=/trunk/; revision=3683
This commit is contained in:
parent
9b875ab82c
commit
b8114825ec
|
@ -1,20 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
int _execl(const char* szPath, const char* szArgv0, ...)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
int i = 0;
|
||||
va_list l = 0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
|
||||
return _spawnve(P_OVERLAY, szPath, szArg, _environ);
|
||||
}
|
|
@ -1,33 +0,0 @@
|
|||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
|
||||
// fixme rewrite to pass the array variants to va_list variant
|
||||
|
||||
int _execle(const char *path, const char *szArgv0, ... /*, const char **envp */)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
char *ptr;
|
||||
int i = 0;
|
||||
va_list l = 0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = (const char *)va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
|
||||
|
||||
// szArg0 is passed and not environment if there is only one parameter;
|
||||
|
||||
if ( i >=2 ) {
|
||||
ptr = szArg[i-2];
|
||||
szArg[i-2] = NULL;
|
||||
}
|
||||
else
|
||||
ptr = NULL;
|
||||
|
||||
|
||||
return _spawnve(P_OVERLAY, path, (char * const *)szArg, (char * const *)ptr);
|
||||
}
|
|
@ -1,17 +0,0 @@
|
|||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
int _execlp(const char *szPath, const char *szArgv0, ...)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
int i = 0;
|
||||
va_list l = 0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = (const char *)va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
return _spawnvpe(P_OVERLAY, szPath,szArg, _environ);
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
|
||||
int execlpe(const char *path, const char *szArgv0, ... /*, const char **envp */)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
char *ptr;
|
||||
int i = 0;
|
||||
va_list l = 0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = (const char *)va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
|
||||
|
||||
// szArg0 is passed and not environment if there is only one parameter;
|
||||
|
||||
if ( i >=2 ) {
|
||||
ptr = szArg[i-2];
|
||||
szArg[i-2] = NULL;
|
||||
}
|
||||
else
|
||||
ptr = NULL;
|
||||
return spawnvpe(P_OVERLAY, path, (char * const *)szArg, (char * const *)ptr);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
|
||||
int _execv(const char* szPath, char* const* szaArgv)
|
||||
{
|
||||
return _spawnve(P_OVERLAY, szPath, szaArgv, _environ);
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
|
||||
#include <msvcrt/process.h>
|
||||
|
||||
int _execve(const char* szPath, char* const* szaArgv, char* const* szaEnv)
|
||||
{
|
||||
return spawnve(P_OVERLAY, szPath, szaArgv, szaEnv);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details *///#include <crtdll/stubs.h>
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
|
||||
int _execvp(const char* szPath, char* const* szaArgv)
|
||||
{
|
||||
return _spawnvpe(P_OVERLAY, szPath, szaArgv, _environ);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
/* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
|
||||
int _execvpe(const char* szPath, char* const* szaArgv, char* const* szaEnv)
|
||||
{
|
||||
return _spawnvpe(P_OVERLAY, szPath, szaArgv, szaEnv);
|
||||
}
|
||||
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
int _spawnl(int nMode, const char* szPath, const char* szArgv0,...)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
int i = 1;
|
||||
va_list l = 0;
|
||||
szArg[0]=(char*)szArgv0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
|
||||
return _spawnve(nMode, szPath, szArg, _environ);
|
||||
}
|
|
@ -1,29 +0,0 @@
|
|||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
|
||||
int _spawnle(int mode, const char *path, const char *szArgv0, ... /*, const char **envp */)
|
||||
{
|
||||
char *szArg[100];
|
||||
char *a;
|
||||
char *ptr;
|
||||
int i = 1;
|
||||
va_list l = 0;
|
||||
szArg[0]=(char*)szArgv0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = (char *)va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
|
||||
if(a != NULL)
|
||||
{
|
||||
// __set_errno(E2BIG);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ptr = (char *)va_arg(l,const char *);
|
||||
|
||||
return _spawnve(mode, path, (char * const *)szArg, (char * const *)ptr);
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
int _spawnlp(int nMode, const char* szPath, const char* szArgv0, ...)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
int i = 0;
|
||||
va_list l = 0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = (const char *)va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
return _spawnvpe(nMode, szPath,szArg, _environ);
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/stdarg.h>
|
||||
|
||||
|
||||
int _spawnlpe(int mode, const char *path, const char *szArgv0, ... /*, const char **envp */)
|
||||
{
|
||||
char *szArg[100];
|
||||
const char *a;
|
||||
char *ptr;
|
||||
int i = 0;
|
||||
va_list l = 0;
|
||||
va_start(l,szArgv0);
|
||||
do {
|
||||
a = (const char *)va_arg(l,const char *);
|
||||
szArg[i++] = (char *)a;
|
||||
} while ( a != NULL && i < 100 );
|
||||
|
||||
|
||||
// szArg0 is passed and not environment if there is only one parameter;
|
||||
|
||||
if ( i >=2 ) {
|
||||
ptr = szArg[i-2];
|
||||
szArg[i-2] = NULL;
|
||||
}
|
||||
else
|
||||
ptr = NULL;
|
||||
|
||||
return _spawnvpe(mode, path, (char * const *)szArg, (char * const *)ptr);
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
|
||||
int _spawnv(int nMode, const char* szPath, char* const* szaArgv)
|
||||
{
|
||||
return _spawnve(nMode, szPath, (char * const *)szaArgv, _environ);
|
||||
}
|
|
@ -1,424 +0,0 @@
|
|||
/* $Id: spawnve.c,v 1.5 2002/09/08 10:22:53 chorns Exp $ */
|
||||
/* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
|
||||
/* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
|
||||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <msvcrt/stdio.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
#include <msvcrt/string.h>
|
||||
#include <msvcrt/errno.h>
|
||||
//#include <msvcrt/limits.h>
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/ctype.h>
|
||||
#include <msvcrt/io.h>
|
||||
#include <msvcrt/fcntl.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <msvcrt/msvcrtdbg.h>
|
||||
|
||||
|
||||
#ifndef F_OK
|
||||
#define F_OK 0x01
|
||||
#endif
|
||||
#ifndef R_OK
|
||||
#define R_OK 0x02
|
||||
#endif
|
||||
#ifndef W_OK
|
||||
#define W_OK 0x04
|
||||
#endif
|
||||
#ifndef X_OK
|
||||
#define X_OK 0x08
|
||||
#endif
|
||||
#ifndef D_OK
|
||||
#define D_OK 0x10
|
||||
#endif
|
||||
|
||||
// information about crtdll file handles is not passed to child
|
||||
int _fileinfo_dll = 0;
|
||||
|
||||
extern int maxfno;
|
||||
|
||||
static int
|
||||
direct_exec_tail(int mode, const char *program,
|
||||
const char *args, const char * envp)
|
||||
{
|
||||
|
||||
STARTUPINFO StartupInfo;
|
||||
PROCESS_INFORMATION ProcessInformation;
|
||||
char* fmode;
|
||||
HANDLE* hFile;
|
||||
int i, last;
|
||||
BOOL bResult;
|
||||
|
||||
DPRINT("direct_exec_tail()\n");
|
||||
|
||||
memset (&StartupInfo, 0, sizeof(STARTUPINFO));
|
||||
StartupInfo.cb = sizeof(STARTUPINFO);
|
||||
|
||||
for (last = i = 0; i < maxfno; i++)
|
||||
{
|
||||
if ((void*)-1 != _get_osfhandle(i))
|
||||
{
|
||||
last = i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (last)
|
||||
{
|
||||
StartupInfo.cbReserved2 = sizeof(ULONG) + last * (sizeof(char) + sizeof(HANDLE));
|
||||
StartupInfo.lpReserved2 = malloc(StartupInfo.cbReserved2);
|
||||
if (StartupInfo.lpReserved2 == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
*(DWORD*)StartupInfo.lpReserved2 = last;
|
||||
fmode = (char*)(StartupInfo.lpReserved2 + sizeof(ULONG));
|
||||
hFile = (HANDLE*)(StartupInfo.lpReserved2 + sizeof(ULONG) + last * sizeof(char));
|
||||
for (i = 0; i < last; i++)
|
||||
{
|
||||
int mode = __fileno_getmode(i);
|
||||
HANDLE h = _get_osfhandle(i);
|
||||
/* FIXME: The test of console handles (((ULONG)Handle) & 0x10000003) == 0x3)
|
||||
* is possible wrong
|
||||
*/
|
||||
if ((((ULONG)h) & 0x10000003) == 0x3 || mode & _O_NOINHERIT)
|
||||
{
|
||||
*hFile = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
*hFile = h;
|
||||
*fmode = (_O_ACCMODE & mode) | (((_O_TEXT | _O_BINARY) & mode) >> 8);
|
||||
}
|
||||
fmode++;
|
||||
hFile++;
|
||||
}
|
||||
}
|
||||
|
||||
bResult = CreateProcessA((char *)program,
|
||||
(char *)args,
|
||||
NULL,
|
||||
NULL,
|
||||
TRUE,
|
||||
mode == _P_DETACH ? DETACHED_PROCESS : 0,
|
||||
(LPVOID)envp,
|
||||
NULL,
|
||||
&StartupInfo,
|
||||
&ProcessInformation);
|
||||
Sleep(100);
|
||||
if (StartupInfo.lpReserved2)
|
||||
{
|
||||
free(StartupInfo.lpReserved2);
|
||||
}
|
||||
|
||||
if (!bResult)
|
||||
{
|
||||
DPRINT("%x\n", GetLastError());
|
||||
__set_errno( GetLastError() );
|
||||
return -1;
|
||||
}
|
||||
CloseHandle(ProcessInformation.hThread);
|
||||
return (int)ProcessInformation.hProcess;
|
||||
}
|
||||
|
||||
static int vdm_exec(int mode, const char *program, char **argv, char *envp)
|
||||
{
|
||||
static char args[1024];
|
||||
int i = 0;
|
||||
args[0] = 0;
|
||||
|
||||
strcpy(args,"vdm.exe ");
|
||||
while(argv[i] != NULL ) {
|
||||
strcat(args,argv[i]);
|
||||
strcat(args," ");
|
||||
i++;
|
||||
}
|
||||
|
||||
return direct_exec_tail(mode,program,args,envp);
|
||||
}
|
||||
|
||||
static int go32_exec(int mode, const char *program, char **argv, char **envp)
|
||||
{
|
||||
char * penvblock, * ptr;
|
||||
char * args;
|
||||
int i, len, result;
|
||||
|
||||
for (i = 0, len = 0; envp[i]; i++) {
|
||||
len += strlen(envp[i]) + 1;
|
||||
}
|
||||
penvblock = ptr = (char*)malloc(len + 1);
|
||||
if (penvblock == NULL)
|
||||
return -1;
|
||||
|
||||
for(i = 0, *ptr = 0; envp[i]; i++) {
|
||||
strcpy(ptr, envp[i]);
|
||||
ptr += strlen(envp[i]) + 1;
|
||||
}
|
||||
*ptr = 0;
|
||||
|
||||
for(i = 0, len = 0; argv[i]; i++) {
|
||||
len += strlen(argv[i]) + 1;
|
||||
}
|
||||
|
||||
args = (char*) malloc(len + 1);
|
||||
if (args == NULL)
|
||||
{
|
||||
free(penvblock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(i = 0, *args = 0; argv[i]; i++) {
|
||||
strcat(args,argv[i]);
|
||||
if (argv[i+1] != NULL) {
|
||||
strcat(args," ");
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("'%s'\n", args);
|
||||
result = direct_exec_tail(mode, program,args,(const char*)penvblock);
|
||||
free(args);
|
||||
free(penvblock);
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
command_exec(int mode, const char *program, char **argv, char *envp)
|
||||
{
|
||||
static char args[1024];
|
||||
int i = 0;
|
||||
|
||||
|
||||
|
||||
args[0] = 0;
|
||||
|
||||
strcpy(args,"cmd.exe /c ");
|
||||
while(argv[i] != NULL ) {
|
||||
strcat(args,argv[i]);
|
||||
strcat(args," ");
|
||||
i++;
|
||||
}
|
||||
|
||||
return direct_exec_tail(mode,program,args,envp);
|
||||
|
||||
}
|
||||
|
||||
static int script_exec(int mode, const char *program, char **argv, char **envp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Note: the following list is not supposed to mention *every*
|
||||
possible extension of an executable file. It only mentions
|
||||
those extensions that can be *omitted* when you invoke the
|
||||
executable from one of the shells used on MSDOS. */
|
||||
static struct {
|
||||
const char *extension;
|
||||
int (*interp)(int , const char*, char **, char **);
|
||||
} interpreters[] = {
|
||||
{ ".com", vdm_exec },
|
||||
{ ".exe", go32_exec },
|
||||
{ ".dll", go32_exec },
|
||||
{ ".cmd", command_exec },
|
||||
{ ".bat", command_exec },
|
||||
{ ".btm", command_exec },
|
||||
{ ".sh", script_exec }, /* for compatibility with ms_sh */
|
||||
{ ".ksh", script_exec },
|
||||
{ ".pl", script_exec }, /* Perl */
|
||||
{ ".sed", script_exec },
|
||||
{ "", go32_exec },
|
||||
{ 0, script_exec }, /* every extension not mentioned above calls it */
|
||||
{ 0, 0 },
|
||||
};
|
||||
|
||||
/* This is the index into the above array of the interpreter
|
||||
which is called when the program filename has no extension. */
|
||||
#define INTERP_NO_EXT (sizeof(interpreters)/sizeof(interpreters[0]) - 3)
|
||||
|
||||
/*-------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
|
||||
int _spawnve(int mode, const char *path, char *const argv[], char *const envp[])
|
||||
{
|
||||
/* This is the one that does the work! */
|
||||
union { char *const *x; char **p; } u;
|
||||
int i = -1;
|
||||
char **argvp;
|
||||
char **envpp;
|
||||
char rpath[FILENAME_MAX], *rp, *rd=0;
|
||||
int e = errno;
|
||||
int is_dir = 0;
|
||||
int found = 0;
|
||||
DWORD ExitCode;
|
||||
|
||||
DPRINT("_spawnve(mode %x, '%s')\n", mode, path);
|
||||
|
||||
if (path == 0 || argv[0] == 0)
|
||||
{
|
||||
errno = EINVAL;
|
||||
DPRINT("??\n");
|
||||
return -1;
|
||||
}
|
||||
if (strlen(path) > FILENAME_MAX - 1)
|
||||
{
|
||||
errno = ENAMETOOLONG;
|
||||
DPRINT("??\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
u.x = argv; argvp = u.p;
|
||||
u.x = envp; envpp = u.p;
|
||||
|
||||
fflush(stdout); /* just in case */
|
||||
for (rp=rpath; *path; *rp++ = *path++)
|
||||
{
|
||||
if (*path == '.')
|
||||
rd = rp;
|
||||
if (*path == '\\' || *path == '/')
|
||||
rd = 0;
|
||||
}
|
||||
*rp = 0;
|
||||
|
||||
/* If LFN is supported on the volume where rpath resides, we
|
||||
might have something like foo.bar.exe or even foo.exe.com.
|
||||
If so, look for RPATH.ext before even trying RPATH itself. */
|
||||
if (!rd)
|
||||
{
|
||||
for (i=0; interpreters[i].extension; i++)
|
||||
{
|
||||
strcpy(rp, interpreters[i].extension);
|
||||
if (_access(rpath, F_OK) == 0 && !(is_dir = (_access(rpath, D_OK) == 0)))
|
||||
{
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
const char *rpath_ext;
|
||||
|
||||
if (rd)
|
||||
{
|
||||
i = 0;
|
||||
rpath_ext = rd;
|
||||
}
|
||||
else
|
||||
{
|
||||
i = INTERP_NO_EXT;
|
||||
rpath_ext = "";
|
||||
}
|
||||
for ( ; interpreters[i].extension; i++)
|
||||
if (_stricmp(rpath_ext, interpreters[i].extension) == 0
|
||||
&& _access(rpath, F_OK) == 0
|
||||
&& !(is_dir = (_access(rpath, D_OK) == 0)))
|
||||
{
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
{
|
||||
DPRINT("??\n");
|
||||
errno = is_dir ? EISDIR : ENOENT;
|
||||
return -1;
|
||||
}
|
||||
errno = e;
|
||||
i = interpreters[i].interp(mode, rpath, argvp, envpp);
|
||||
if (i < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
if (mode == P_OVERLAY)
|
||||
{
|
||||
CloseHandle((HANDLE)i);
|
||||
exit(i);
|
||||
}
|
||||
if (mode == P_WAIT)
|
||||
{
|
||||
WaitForSingleObject((HANDLE)i, INFINITE);
|
||||
GetExitCodeProcess((HANDLE)i, &ExitCode);
|
||||
CloseHandle((HANDLE)i);
|
||||
i = (int)ExitCode;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const char * find_exec(char * path,char *rpath)
|
||||
{
|
||||
char *rp, *rd=0;
|
||||
int i;
|
||||
int is_dir = 0;
|
||||
int found = 0;
|
||||
if (path == 0 )
|
||||
return 0;
|
||||
if (strlen(path) > FILENAME_MAX - 1)
|
||||
return path;
|
||||
|
||||
/* copy path in rpath */
|
||||
for (rd=path,rp=rpath; *rd; *rp++ = *rd++)
|
||||
;
|
||||
*rp = 0;
|
||||
/* try first with the name as is */
|
||||
for (i=0; interpreters[i].extension; i++)
|
||||
{
|
||||
strcpy(rp, interpreters[i].extension);
|
||||
if (_access(rpath, F_OK) == 0 && !(is_dir = (_access(rpath, D_OK) == 0)))
|
||||
{
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
/* search in the PATH */
|
||||
char winpath[MAX_PATH];
|
||||
if( GetEnvironmentVariableA("PATH",winpath,MAX_PATH))
|
||||
{
|
||||
char *ep=winpath;
|
||||
while( *ep)
|
||||
{
|
||||
if(*ep == ';') ep++;
|
||||
rp=rpath;
|
||||
for ( ; *ep && (*ep != ';') ; *rp++ = *ep++)
|
||||
;
|
||||
*rp++='/';
|
||||
for (rd=path ; *rd ; *rp++ = *rd++)
|
||||
;
|
||||
|
||||
for (i=0; interpreters[i].extension; i++)
|
||||
{
|
||||
strcpy(rp, interpreters[i].extension);
|
||||
if (_access(rpath, F_OK) == 0 && !(is_dir = (_access(rpath, D_OK) == 0)))
|
||||
{
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (found) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
return path;
|
||||
|
||||
return rpath;
|
||||
}
|
||||
|
||||
int _spawnvpe(int nMode, const char* szPath, char* const* szaArgv, char* const* szaEnv)
|
||||
{
|
||||
char rpath[FILENAME_MAX];
|
||||
|
||||
return _spawnve(nMode, find_exec((char*)szPath,rpath), szaArgv, szaEnv);
|
||||
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
|
||||
int _spawnvp(int nMode, const char* szPath, char* const* szaArgv)
|
||||
{
|
||||
return spawnvpe(nMode, szPath, (char * const *)szaArgv, _environ);
|
||||
}
|
|
@ -1,11 +0,0 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <msvcrt/process.h>
|
||||
#include <msvcrt/errno.h>
|
||||
|
||||
#if 0
|
||||
int _spawnvpe(int nMode, const char* szPath, char* const* szaArgv, char* const* szaEnv)
|
||||
{
|
||||
return spawnve(nMode, szPath, szaArgv, szaEnv);
|
||||
}
|
||||
#endif
|
Loading…
Reference in a new issue