Introduction
Introduction Statistics Contact Development Disclaimer Help
tAdd searchpath(). - plan9port - [fork] Plan 9 from user space
git clone git://src.adamsgaard.dk/plan9port
Log
Files
Refs
README
LICENSE
---
commit 4a6237114063e9cc3d7a3b544f9477d93738c1a0
parent 28125cbd4c7d937278d838f1e375ee0763019d0d
Author: rsc <devnull@localhost>
Date: Sun, 23 Jan 2005 22:33:59 +0000
Add searchpath().
Diffstat:
M include/libc.h | 1 +
M src/lib9/mkfile | 1 +
A src/lib9/searchpath.c | 62 +++++++++++++++++++++++++++++…
3 files changed, 64 insertions(+), 0 deletions(-)
---
diff --git a/include/libc.h b/include/libc.h
t@@ -390,6 +390,7 @@ extern int postnote(int, int, char *);
extern double p9pow10(int);
/* extern int putenv(char*, char*); <stdlib.h. */
/* extern void qsort(void*, long, long, int (*)(void*, void*)); …
+extern char* searchpath(char*);
/* extern int p9setjmp(p9jmp_buf); */
#define p9setjmp(b) sigsetjmp((void*)(b), 1)
/*
diff --git a/src/lib9/mkfile b/src/lib9/mkfile
t@@ -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
t@@ -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;
+}
+
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.