1*5e96a66cSDavid du Colombier #include "stdinc.h" 2*5e96a66cSDavid du Colombier 3*5e96a66cSDavid du Colombier #include "9.h" 4*5e96a66cSDavid du Colombier 5*5e96a66cSDavid du Colombier int Dflag; 6*5e96a66cSDavid du Colombier char* none = "none"; 7*5e96a66cSDavid du Colombier int stdfd[2]; 8*5e96a66cSDavid du Colombier 9*5e96a66cSDavid du Colombier static char* myname = "numpty"; 10*5e96a66cSDavid du Colombier 11*5e96a66cSDavid du Colombier static void 12*5e96a66cSDavid du Colombier usage(void) 13*5e96a66cSDavid du Colombier { 14*5e96a66cSDavid du Colombier argv0 = myname; 15*5e96a66cSDavid du Colombier sysfatal("usage: %s" 16*5e96a66cSDavid du Colombier " [-Dt]" 17*5e96a66cSDavid du Colombier " [-c cmd]", 18*5e96a66cSDavid du Colombier myname); 19*5e96a66cSDavid du Colombier } 20*5e96a66cSDavid du Colombier 21*5e96a66cSDavid du Colombier void 22*5e96a66cSDavid du Colombier main(int argc, char* argv[]) 23*5e96a66cSDavid du Colombier { 24*5e96a66cSDavid du Colombier char **cmd, *p; 25*5e96a66cSDavid du Colombier int i, ncmd, tflag; 26*5e96a66cSDavid du Colombier 27*5e96a66cSDavid du Colombier myname = argv[0]; 28*5e96a66cSDavid du Colombier fmtinstall('D', dirfmt); 29*5e96a66cSDavid du Colombier fmtinstall('F', fcallfmt); 30*5e96a66cSDavid du Colombier fmtinstall('M', dirmodefmt); 31*5e96a66cSDavid du Colombier quotefmtinstall(); 32*5e96a66cSDavid du Colombier 33*5e96a66cSDavid du Colombier /* 34*5e96a66cSDavid du Colombier * Insulate from the invoker's environment. 35*5e96a66cSDavid du Colombier */ 36*5e96a66cSDavid du Colombier if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0) 37*5e96a66cSDavid du Colombier sysfatal("rfork: %r"); 38*5e96a66cSDavid du Colombier 39*5e96a66cSDavid du Colombier close(0); 40*5e96a66cSDavid du Colombier open("/dev/null", OREAD); 41*5e96a66cSDavid du Colombier close(1); 42*5e96a66cSDavid du Colombier open("/dev/null", OWRITE); 43*5e96a66cSDavid du Colombier 44*5e96a66cSDavid du Colombier cmd = nil; 45*5e96a66cSDavid du Colombier ncmd = tflag = 0; 46*5e96a66cSDavid du Colombier 47*5e96a66cSDavid du Colombier vtAttach(); 48*5e96a66cSDavid du Colombier 49*5e96a66cSDavid du Colombier ARGBEGIN{ 50*5e96a66cSDavid du Colombier case '?': 51*5e96a66cSDavid du Colombier default: 52*5e96a66cSDavid du Colombier usage(); 53*5e96a66cSDavid du Colombier break; 54*5e96a66cSDavid du Colombier case 'D': 55*5e96a66cSDavid du Colombier Dflag ^= 1; 56*5e96a66cSDavid du Colombier break; 57*5e96a66cSDavid du Colombier case 'c': 58*5e96a66cSDavid du Colombier p = ARGF(); 59*5e96a66cSDavid du Colombier if(p == nil) 60*5e96a66cSDavid du Colombier usage(); 61*5e96a66cSDavid du Colombier cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); 62*5e96a66cSDavid du Colombier cmd[ncmd++] = p; 63*5e96a66cSDavid du Colombier break; 64*5e96a66cSDavid du Colombier case 't': 65*5e96a66cSDavid du Colombier tflag = 1; 66*5e96a66cSDavid du Colombier break; 67*5e96a66cSDavid du Colombier }ARGEND 68*5e96a66cSDavid du Colombier if(argc != 0) 69*5e96a66cSDavid du Colombier usage(); 70*5e96a66cSDavid du Colombier 71*5e96a66cSDavid du Colombier consInit(); 72*5e96a66cSDavid du Colombier cliInit(); 73*5e96a66cSDavid du Colombier procInit(); 74*5e96a66cSDavid du Colombier cmdInit(); 75*5e96a66cSDavid du Colombier fsysInit(); 76*5e96a66cSDavid du Colombier exclInit(); 77*5e96a66cSDavid du Colombier fidInit(); 78*5e96a66cSDavid du Colombier 79*5e96a66cSDavid du Colombier srvInit(); 80*5e96a66cSDavid du Colombier lstnInit(); 81*5e96a66cSDavid du Colombier usersInit(); 82*5e96a66cSDavid du Colombier 83*5e96a66cSDavid du Colombier for(i = 0; i < ncmd; i++){ 84*5e96a66cSDavid du Colombier if(cliExec(cmd[i]) == 0) 85*5e96a66cSDavid du Colombier break; 86*5e96a66cSDavid du Colombier } 87*5e96a66cSDavid du Colombier vtMemFree(cmd); 88*5e96a66cSDavid du Colombier 89*5e96a66cSDavid du Colombier if(tflag && consTTY() == 0) 90*5e96a66cSDavid du Colombier consPrint("%s\n", vtGetError()); 91*5e96a66cSDavid du Colombier 92*5e96a66cSDavid du Colombier vtDetach(); 93*5e96a66cSDavid du Colombier exits(0); 94*5e96a66cSDavid du Colombier } 95