#include <u.h> | |
#include <libc.h> | |
/* | |
* Search $PATH for an executable with the given name. | |
* Like in rc, mid-name slashes do not disable search. | |
* Should probably handle escaped colons, | |
* but I don't know what the syntax is. | |
*/ | |
char* | |
searchpath(char *name) | |
{ | |
char *path, *p, *next; | |
char *s, *ss; | |
int ns, l; | |
s = nil; | |
ns = 0; | |
if((name[0] == '.' && name[1] == '/') | |
|| (name[0] == '.' && name[1] == '.' && name[2] == '/') | |
|| (name[0] == '/')){ | |
if(access(name, AEXEC) >= 0) | |
return strdup(name); | |
return nil; | |
} | |
path = getenv("PATH"); | |
for(p=path; p && *p; p=next){ | |
if((next = strchr(p, ':')) != nil) | |
*next++ = 0; | |
if(*p == 0){ | |
if(access(name, AEXEC) >= 0){ | |
free(s); | |
free(path); | |
return strdup(name); | |
} | |
}else{ | |
l = strlen(p)+1+strlen(name)+1; | |
if(l > ns){ | |
ss = realloc(s, l); | |
if(ss == nil){ | |
free(s); | |
free(path); | |
return nil; | |
} | |
s = ss; | |
ns = l; | |
} | |
strcpy(s, p); | |
strcat(s, "/"); | |
strcat(s, name); | |
if(access(s, AEXEC) >= 0){ | |
free(path); | |
return s; | |
} | |
} | |
} | |
free(s); | |
free(path); | |
return nil; | |
} | |