if(rfork(arg)==-1){
pfmt(err, "rc: %s failed\n", runq->argv->words->word);
setstatus("rfork failed");
- }
- else
+ } else {
+ if(arg & RFCFDG){
+ struct redir *rp;
+ for(rp = runq->redir; rp; rp = rp->next)
+ rp->type = 0;
+ }
setstatus("");
+ }
poplist();
}
}
close(dir);
}
-int envdir;
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;
- }
- }
- }
+ if(runq->argv->words == 0)
+ poplist();
+ else {
+ free(runq->cmdfile);
+ int f = open(runq->argv->words->word, 0);
+ lexline = 0;
+ runq->cmdfile = strdup(runq->argv->words->word);
+ runq->pc--;
+ popword();
+ if(f>=0) execcmds(openfd(f));
}
- close(envdir);
- Xreturn();
}
-union code rdfns[4];
+union code rdfns[8];
void
execfinit(void)
static int first = 1;
if(first){
rdfns[0].i = 1;
- rdfns[1].f = Xrdfn;
- rdfns[2].f = Xjump;
- rdfns[3].i = 1;
+ rdfns[1].f = Xmark;
+ rdfns[2].f = Xglobs;
+ rdfns[4].i = Globsize(rdfns[3].s = "/env/fn#\001*");
+ rdfns[5].f = Xglob;
+ rdfns[6].f = Xrdfn;
+ rdfns[7].f = Xreturn;
first = 0;
}
- Xpopm();
- envdir = open("/env", 0);
- if(envdir<0){
- pfmt(err, "rc: can't open /env: %r\n");
- return;
- }
+ poplist();
start(rdfns, 1, runq->local);
}
int
Opendir(char *name)
{
- Dir *db;
int f;
- f = open(name, 0);
- if(f==-1)
- return f;
- db = dirfstat(f);
- if(db!=nil && (db->mode&DMDIR)){
- if(f<NFD){
- dir[f].i = 0;
- dir[f].n = 0;
- }
- free(db);
+
+ if((f = open(name, 0)) < 0)
return f;
+ if(f<NFD){
+ dir[f].i = 0;
+ dir[f].n = 0;
}
- free(db);
- close(f);
- return -1;
+ return f;
}
static int
return w;
}
-/*
- * onlydirs is advisory -- it means you only
- * need to return the directories. it's okay to
- * return files too (e.g., on unix where you can't
- * tell during the readdir), but that just makes
- * the globber work harder.
- */
int
Readdir(int f, void *p, int onlydirs)
{