mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
62 lines
1.5 KiB
C++
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
|
|
|