Blame


1 4a623711 2005-01-23 devnull #include <u.h>
2 4a623711 2005-01-23 devnull #include <libc.h>
3 4a623711 2005-01-23 devnull
4 4a623711 2005-01-23 devnull /*
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.
9 4a623711 2005-01-23 devnull */
10 4a623711 2005-01-23 devnull char*
11 4a623711 2005-01-23 devnull searchpath(char *name)
12 4a623711 2005-01-23 devnull {
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;
16 4a623711 2005-01-23 devnull
17 4a623711 2005-01-23 devnull s = nil;
18 4a623711 2005-01-23 devnull ns = 0;
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;
25 4a623711 2005-01-23 devnull }
26 4a623711 2005-01-23 devnull
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){
33 4a623711 2005-01-23 devnull free(s);
34 4a623711 2005-01-23 devnull free(path);
35 4a623711 2005-01-23 devnull return strdup(name);
36 4a623711 2005-01-23 devnull }
37 4a623711 2005-01-23 devnull }else{
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){
42 4a623711 2005-01-23 devnull free(s);
43 4a623711 2005-01-23 devnull free(path);
44 4a623711 2005-01-23 devnull return nil;
45 4a623711 2005-01-23 devnull }
46 4a623711 2005-01-23 devnull s = ss;
47 4a623711 2005-01-23 devnull ns = l;
48 4a623711 2005-01-23 devnull }
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;
55 4a623711 2005-01-23 devnull }
56 4a623711 2005-01-23 devnull }
57 4a623711 2005-01-23 devnull }
58 4a623711 2005-01-23 devnull free(s);
59 4a623711 2005-01-23 devnull free(path);
60 4a623711 2005-01-23 devnull return nil;
61 4a623711 2005-01-23 devnull }