void Xrdfn(void) { int f, len; Dir *e; char envname[Maxenvname]; static Dir *ent, *allocent; static int nent; for(;;){ if(nent == 0){ free(allocent); nent = dirread(envdir, &allocent); ent = allocent; } if(nent <= 0) break; while(nent){ e = ent++; nent--; len = e->length; if(len && strncmp(e->name, "fn#", 3)==0){ snprint(envname, sizeof envname, "/env/%s", e->name); if((f = open(envname, 0))>=0){ execcmds(openfd(f)); return; } } } } close(envdir); Xreturn(); }
void vinit(void) { char **env, *name, *val, *p; int i; Word *w; Io *f; int n; Var *v; env = _environ; for(i=0; env[i]; free(name), i++) { name = strdup(env[i]); p = strchr(name, '='); if(p == 0 || p == name) continue; *p = 0; val = p+1; n = strlen(val); if(n == 0) continue; if(strncmp(name, "fn#", 3)!=0) { /* variable */ w = 0; p = val+n-1; while(*p) { if(*p == IWS) *p-- = 0; for(; *p && *p != IWS; p--) ; w=newword(p+1, w); } setvar(name, w); vlook(name)->changed=0; } else { /* function */ f = opencore(val, n); execcmds(f); } } v = vlook("path"); p = getenv("path"); if(v->val == 0 && p) v->val = newword(p, 0); }
void execeval(void) { char *cmdline, *s, *t; int len = 0; word *ap; if(count(runq->argv->words)<=1){ Xerror1("Usage: eval cmd ..."); return; } eflagok = 1; for(ap = runq->argv->words->next;ap;ap = ap->next) len+=1+strlen(ap->word); cmdline = emalloc(len); s = cmdline; for(ap = runq->argv->words->next;ap;ap = ap->next){ for(t = ap->word;*t;) *s++=*t++; *s++=' '; } s[-1]='\n'; poplist(); execcmds(opencore(cmdline, len)); efree(cmdline); }