aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/var.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-12 16:59:50 +0000
committerrsc <devnull@localhost>2005-01-12 16:59:50 +0000
commita9eaaa03e043ba8e1b2f67d7c8c7ba471db6ba4b (patch)
tree8bf6f1d90736df59a47098a94ea06a0501f99a76 /src/cmd/rc/var.c
parent7b0c2f155dc4ac20d65c6a9899ae223053379fcd (diff)
downloadplan9port-a9eaaa03e043ba8e1b2f67d7c8c7ba471db6ba4b.tar.gz
plan9port-a9eaaa03e043ba8e1b2f67d7c8c7ba471db6ba4b.tar.bz2
plan9port-a9eaaa03e043ba8e1b2f67d7c8c7ba471db6ba4b.zip
maintain $path and $PATH simultaneously
Diffstat (limited to 'src/cmd/rc/var.c')
-rw-r--r--src/cmd/rc/var.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/src/cmd/rc/var.c b/src/cmd/rc/var.c
index 73e4e9ae..8a200ffd 100644
--- a/src/cmd/rc/var.c
+++ b/src/cmd/rc/var.c
@@ -62,10 +62,70 @@ var *vlook(char *name)
if(strcmp(v->name, name)==0) return v;
return gvlook(name);
}
-void setvar(char *name, word *val)
+void _setvar(char *name, word *val, int callfn)
{
register struct var *v=vlook(name);
freewords(v->val);
v->val=val;
v->changed=1;
+ if(callfn && v->changefn)
+ v->changefn(v);
+}
+void setvar(char *name, word *val)
+{
+ _setvar(name, val, 1);
+}
+void bigpath(var *v)
+{
+ /* convert $PATH to $path */
+ char *p, *q;
+ word **l, *w;
+
+ if(v->val == nil){
+ _setvar("path", nil, 0);
+ return;
+ }
+ p = v->val->word;
+ w = nil;
+ l = &w;
+ /*
+ * Doesn't handle escaped colon nonsense.
+ */
+ if(p[0] == 0)
+ p = nil;
+ while(p){
+ q = strchr(p, ':');
+ if(q)
+ *q = 0;
+ *l = newword(p[0] ? p : ".", nil);
+ l = &(*l)->next;
+ if(q){
+ *q = ':';
+ p = q+1;
+ }else
+ p = nil;
+ }
+ _setvar("path", w, 0);
+}
+void littlepath(var *v)
+{
+ /* convert $path to $PATH */
+ char *p;
+ word *w;
+
+ p = _list2str(v->val, ':');
+ w = new(word);
+ w->word = p;
+ w->next = nil;
+ _setvar("PATH", w, 1); /* 1: recompute $path to expose colon problems */
+}
+void pathinit(void)
+{
+ var *v;
+
+ v = gvlook("path");
+ v->changefn = littlepath;
+ v = gvlook("PATH");
+ v->changefn = bigpath;
+ bigpath(v);
}