1 4a623711 2005-01-23 devnull #include <u.h>
2 4a623711 2005-01-23 devnull #include <libc.h>
5 4a623711 2005-01-23 devnull * Search $PATH for an executable with the given name.
6 4a623711 2005-01-23 devnull * Like in rc, mid-name slashes do not disable search.
7 4a623711 2005-01-23 devnull * Should probably handle escaped colons,
8 4a623711 2005-01-23 devnull * but I don't know what the syntax is.
11 4a623711 2005-01-23 devnull searchpath(char *name)
13 4a623711 2005-01-23 devnull char *path, *p, *next;
14 4a623711 2005-01-23 devnull char *s, *ss;
15 4a623711 2005-01-23 devnull int ns, l;
19 4a623711 2005-01-23 devnull if((name[0] == '.' && name[1] == '/')
20 4a623711 2005-01-23 devnull || (name[0] == '.' && name[1] == '.' && name[2] == '/')
21 4a623711 2005-01-23 devnull || (name[0] == '/')){
22 4a623711 2005-01-23 devnull if(access(name, AEXEC) >= 0)
23 4a623711 2005-01-23 devnull return strdup(name);
24 4a623711 2005-01-23 devnull return nil;
27 4a623711 2005-01-23 devnull path = getenv("PATH");
28 4a623711 2005-01-23 devnull for(p=path; p && *p; p=next){
29 4a623711 2005-01-23 devnull if((next = strchr(p, ':')) != nil)
30 4a623711 2005-01-23 devnull *next++ = 0;
31 4a623711 2005-01-23 devnull if(*p == 0){
32 4a623711 2005-01-23 devnull if(access(name, AEXEC) >= 0){
34 4a623711 2005-01-23 devnull free(path);
35 4a623711 2005-01-23 devnull return strdup(name);
38 4a623711 2005-01-23 devnull l = strlen(p)+1+strlen(name)+1;
39 4a623711 2005-01-23 devnull if(l > ns){
40 4a623711 2005-01-23 devnull ss = realloc(s, l);
41 4a623711 2005-01-23 devnull if(ss == nil){
43 4a623711 2005-01-23 devnull free(path);
44 4a623711 2005-01-23 devnull return nil;
49 4a623711 2005-01-23 devnull strcpy(s, p);
50 4a623711 2005-01-23 devnull strcat(s, "/");
51 4a623711 2005-01-23 devnull strcat(s, name);
52 4a623711 2005-01-23 devnull if(access(s, AEXEC) >= 0){
53 4a623711 2005-01-23 devnull free(path);
54 4a623711 2005-01-23 devnull return s;
59 4a623711 2005-01-23 devnull free(path);
60 4a623711 2005-01-23 devnull return nil;