|  | #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; | 
|  | } | 
|  |  |