1 #include "error.h"
2 #include "stralloc.h"
3 #include "str.h"
4 #include "env.h"
5 #include "pathexec.h"
6
7 static stralloc tmp;
8
pathexec_run(char * file,char ** argv,char ** envp)9 void pathexec_run(char *file,char **argv,char **envp)
10 {
11 char *path;
12 unsigned int split;
13 int savederrno;
14
15 if (file[str_chr(file,'/')]) {
16 execve(file,argv,envp);
17 return;
18 }
19
20 path = env_get("PATH");
21 if (!path) path = "/bin:/usr/bin";
22
23 savederrno = 0;
24 for (;;) {
25 split = str_chr(path,':');
26 if (!stralloc_copyb(&tmp,path,split)) return;
27 if (!split)
28 if (!stralloc_cats(&tmp,".")) return;
29 if (!stralloc_cats(&tmp,"/")) return;
30 if (!stralloc_cats(&tmp,file)) return;
31 if (!stralloc_0(&tmp)) return;
32
33 execve(tmp.s,argv,envp);
34 if (errno != error_noent) {
35 savederrno = errno;
36 if ((errno != error_acces) && (errno != error_perm) && (errno != error_isdir)) return;
37 }
38
39 if (!path[split]) {
40 if (savederrno) errno = savederrno;
41 return;
42 }
43 path += split;
44 path += 1;
45 }
46 }
47