]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/rc/plan9.c
git/branch: somewhere in the syncing, the fix for junk files was lost
[plan9front.git] / sys / src / cmd / rc / plan9.c
index a9dcdddfeadd035dec90f438629216ce7d8bc579..634570c26fb93ba63239b75976b6b32220348efa 100644 (file)
@@ -93,9 +93,14 @@ execnewpgrp(void)
        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();
 }
 
@@ -152,42 +157,23 @@ Vinit(void)
        }
        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)
@@ -195,17 +181,15 @@ 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);
 }
 
@@ -364,23 +348,15 @@ struct{
 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
@@ -394,13 +370,6 @@ trimdirs(Dir *d, int nd)
        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)
 {