commit a9eaaa03e043ba8e1b2f67d7c8c7ba471db6ba4b from: rsc date: Wed Jan 12 16:59:50 2005 UTC maintain $path and $PATH simultaneously commit - 7b0c2f155dc4ac20d65c6a9899ae223053379fcd commit + a9eaaa03e043ba8e1b2f67d7c8c7ba471db6ba4b blob - ebed11d82e4b2728dd7e1dc26e43bcc75385b069 blob + 9ab7c29d98fb17f6f359355833b2cfb8b8611fe9 --- src/cmd/rc/exec.c +++ src/cmd/rc/exec.c @@ -117,6 +117,7 @@ main(int argc, char *argv[]) Trapinit(); Vinit(); itoa(num, mypid=getpid()); + pathinit(); setvar("pid", newword(num, (word *)0)); setvar("cflag", flag['c']?newword(flag['c'][0], (word *)0) :(word *)0); @@ -369,7 +370,7 @@ void Xwrite(void){ runq->pc++; poplist(); } -char *list2str(word *words){ +char *_list2str(word *words, int c){ char *value, *s, *t; int len=0; word *ap; @@ -379,12 +380,15 @@ char *list2str(word *words){ s=value; for(ap=words;ap;ap=ap->next){ for(t=ap->word;*t;) *s++=*t++; - *s++=' '; + *s++=c; } if(s==value) *s='\0'; else s[-1]='\0'; return value; } +char *list2str(word *words){ + return _list2str(words, ' '); +} void Xmatch(void){ word *p; char *subject; @@ -464,6 +468,8 @@ void Xassign(void){ freewords(v->val); v->val=runq->argv->words; v->changed=1; + if(v->changefn) + v->changefn(v); runq->argv->words=0; poplist(); } blob - 4c8be104c4041c9eab5037faf01680e04a4a4454 blob + b9e5cb73698c47d53ec67dcb512a2e7f65dec366 --- src/cmd/rc/fns.h +++ src/cmd/rc/fns.h @@ -27,6 +27,7 @@ void cleanhere(char*); void codefree(code*); int compile(tree*); char * list2str(word*); +char * _list2str(word*, int); int count(word*); void deglob(char*); void dotrap(void); @@ -39,6 +40,7 @@ void kinit(void); int match(char*, char*, int); int matchfn(char*, char*); void panic(char*, int); +void pathinit(void); void poplist(void); void popword(void); void pprompt(void); @@ -48,6 +50,7 @@ void pushword(char*); void readhere(void); void setstatus(char*); void setvar(char*, word*); +void _setvar(char*, word*, int); void skipnl(void); void start(code*, int, var*); int truestatus(void); blob - 9a73927240d40fc19f0fe5096f8483363d61ad3c blob + b7edbac48714b77acabdcc179b95b18f96e7824f --- src/cmd/rc/rc.h +++ src/cmd/rc/rc.h @@ -84,6 +84,7 @@ struct var{ int fnchanged; int pc; /* pc of start of function */ var *next; /* next on hash or local list */ + void (*changefn)(var*); }; var *vlook(char*), *gvlook(char*), *newvar(char*, var*); #define NVAR 521 blob - 5318c9fd281e25f6ac639878189156439edb98e7 blob + a65bec22a455a4272a1d6a5d6720c5fdcfc68ff2 --- src/cmd/rc/simple.c +++ src/cmd/rc/simple.c @@ -168,7 +168,7 @@ void execcd(void){ if(cdpath==0) pfmt(err, "Can't cd %s: %r\n", a->next->word); break; case 1: - a=vlook("home")->val; + a=vlook("HOME")->val; if(count(a)>=1){ if(dochdir(a->word)>=0) setstatus(""); blob - 73e4e9aec52cf7161e0412cd85c17e46165a0f39 blob + 8a200ffd4d705c3e30573d166bbe165c1d8f4745 --- src/cmd/rc/var.c +++ 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); +}