ultimatepp/bazaar/SysExec/execvpe.cpp
micio 0c45bc9b9a Bazaar/SysExec : almost fixed windows part -- need deep testing
git-svn-id: svn://ultimatepp.org/upp/trunk@3053 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2011-01-20 22:56:11 +00:00

62 lines
1.5 KiB
C++

///////////////////////////////////////////////////////////////////////////////////////////////
// this one is let here just for reference -- superseded by linux builtin call
#if 0
#define DEFAULT_PATH "/bin:/usr/bin:."
static int execvpe(const char *file, char * const *argv, char * const *envp)
{
char path[PATH_MAX];
const char *searchpath, *esp;
size_t prefixlen, filelen, totallen;
if (strchr(file, '/')) /* Specific path */
return execve(file, argv, envp);
filelen = strlen(file);
searchpath = getenv("PATH");
if (!searchpath)
searchpath = DEFAULT_PATH;
errno = ENOENT; /* Default errno, if execve() doesn't change it */
do
{
esp = strchr(searchpath, ':');
if (esp)
prefixlen = esp - searchpath;
else
prefixlen = strlen(searchpath);
if (prefixlen == 0 || searchpath[prefixlen-1] == '/')
{
totallen = prefixlen + filelen;
if (totallen >= PATH_MAX)
continue;
memcpy(path, searchpath, prefixlen);
memcpy(path + prefixlen, file, filelen);
}
else
{
totallen = prefixlen + filelen + 1;
if (totallen >= PATH_MAX)
continue;
memcpy(path, searchpath, prefixlen);
path[prefixlen] = '/';
memcpy(path + prefixlen + 1, file, filelen);
}
path[totallen] = '\0';
execve(path, argv, envp);
if (errno == E2BIG || errno == ENOEXEC ||
errno == ENOMEM || errno == ETXTBSY)
break; /* Report this as an error, no more search */
searchpath = esp + 1;
}
while (esp);
return -1;
}
#endif