aboutsummaryrefslogtreecommitdiff
path: root/src/lib9
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-23 22:33:59 +0000
committerrsc <devnull@localhost>2005-01-23 22:33:59 +0000
commit4a6237114063e9cc3d7a3b544f9477d93738c1a0 (patch)
treea68c25dd45781f5f5708a24eeb5cf1c9f4f5cfbd /src/lib9
parent28125cbd4c7d937278d838f1e375ee0763019d0d (diff)
downloadplan9port-4a6237114063e9cc3d7a3b544f9477d93738c1a0.tar.gz
plan9port-4a6237114063e9cc3d7a3b544f9477d93738c1a0.tar.bz2
plan9port-4a6237114063e9cc3d7a3b544f9477d93738c1a0.zip
Add searchpath().
Diffstat (limited to 'src/lib9')
-rw-r--r--src/lib9/mkfile1
-rw-r--r--src/lib9/searchpath.c62
2 files changed, 63 insertions, 0 deletions
diff --git a/src/lib9/mkfile b/src/lib9/mkfile
index 34faf95c..361ab5b7 100644
--- a/src/lib9/mkfile
+++ b/src/lib9/mkfile
@@ -131,6 +131,7 @@ LIB9OFILES=\
read9pmsg.$O\
readn.$O\
rfork.$O\
+ searchpath.$O\
seek.$O\
sendfd.$O\
sleep.$O\
diff --git a/src/lib9/searchpath.c b/src/lib9/searchpath.c
new file mode 100644
index 00000000..3b8e7daa
--- /dev/null
+++ b/src/lib9/searchpath.c
@@ -0,0 +1,62 @@
+#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;
+}
+