int main(int argc, char *argv[]){ int i; if(argc < 3){ fprintf(stderr, "Too few arguments"); exit(EXIT_FAILURE); } signal(SIGINT,int_handler); signal(SIGPIPE,pipe_handler); pattern = argv[1]; for(i = 2; i < argc; i++){ filesread++; execfunc(argv[i]); } fprintf(stdout, "Reached end of files\n"); fprintf(stdout, "Files read: %d\n", filesread); fprintf(stdout, "Bytes processed: %d\n", bytesread); fprintf(stdout, "Exit\n"); return 0; }
void Xsimple(void) { word *a; thread *p = runq; var *v; struct builtin *bp; int pid; globlist(); a = runq->argv->words; if(a==0){ Xerror1("empty argument list"); return; } if(flag['x']) pfmt(err, "%v\n", p->argv->words); /* wrong, should do redirs */ v = gvlook(a->word); if(v->fn) execfunc(v); else{ if(strcmp(a->word, "builtin")==0){ if(count(a)==1){ pfmt(err, "builtin: empty argument list\n"); setstatus("empty arg list"); poplist(); return; } a = a->next; popword(); } for(bp = Builtin;bp->name;bp++) if(strcmp(a->word, bp->name)==0){ (*bp->fnc)(); return; } if(exitnext()){ /* fork and wait is redundant */ pushword("exec"); execexec(); Xexit(); } else{ flush(err); Updenv(); /* necessary so changes don't go out again */ if((pid = execforkexec()) < 0){ Xerror("try again"); return; } /* interrupts don't get us out */ poplist(); while(Waitfor(pid, 1) < 0) ; } } }
/* parse and execute a string */ void execcmd(void) { char *resid; char *p = cmd_buf; while (*p) { memset(argv, 0, sizeof(argv)); parseargs(p, &argc, argv, &resid); /* execute a function */ if (argc > 0) { execfunc(argc, (const char **) argv); } p = resid; } }