15e96a66cSDavid du Colombier #include "stdinc.h" 25e96a66cSDavid du Colombier 35e96a66cSDavid du Colombier #include "9.h" 45e96a66cSDavid du Colombier 55e96a66cSDavid du Colombier int Dflag; 65e96a66cSDavid du Colombier char* none = "none"; 75e96a66cSDavid du Colombier int stdfd[2]; 85e96a66cSDavid du Colombier 95e96a66cSDavid du Colombier static char* myname = "numpty"; 105e96a66cSDavid du Colombier 115e96a66cSDavid du Colombier static void 125e96a66cSDavid du Colombier usage(void) 135e96a66cSDavid du Colombier { 145e96a66cSDavid du Colombier argv0 = myname; 155e96a66cSDavid du Colombier sysfatal("usage: %s" 165e96a66cSDavid du Colombier " [-Dt]" 175e96a66cSDavid du Colombier " [-c cmd]", 185e96a66cSDavid du Colombier myname); 195e96a66cSDavid du Colombier } 205e96a66cSDavid du Colombier 215e96a66cSDavid du Colombier void 225e96a66cSDavid du Colombier main(int argc, char* argv[]) 235e96a66cSDavid du Colombier { 245e96a66cSDavid du Colombier char **cmd, *p; 255e96a66cSDavid du Colombier int i, ncmd, tflag; 265e96a66cSDavid du Colombier 275e96a66cSDavid du Colombier myname = argv[0]; 285e96a66cSDavid du Colombier fmtinstall('D', dirfmt); 295e96a66cSDavid du Colombier fmtinstall('F', fcallfmt); 305e96a66cSDavid du Colombier fmtinstall('M', dirmodefmt); 315e96a66cSDavid du Colombier quotefmtinstall(); 325e96a66cSDavid du Colombier 335e96a66cSDavid du Colombier /* 345e96a66cSDavid du Colombier * Insulate from the invoker's environment. 355e96a66cSDavid du Colombier */ 365e96a66cSDavid du Colombier if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0) 375e96a66cSDavid du Colombier sysfatal("rfork: %r"); 385e96a66cSDavid du Colombier 395e96a66cSDavid du Colombier close(0); 405e96a66cSDavid du Colombier open("/dev/null", OREAD); 415e96a66cSDavid du Colombier close(1); 425e96a66cSDavid du Colombier open("/dev/null", OWRITE); 435e96a66cSDavid du Colombier 445e96a66cSDavid du Colombier cmd = nil; 455e96a66cSDavid du Colombier ncmd = tflag = 0; 465e96a66cSDavid du Colombier 475e96a66cSDavid du Colombier vtAttach(); 485e96a66cSDavid du Colombier 495e96a66cSDavid du Colombier ARGBEGIN{ 505e96a66cSDavid du Colombier case '?': 515e96a66cSDavid du Colombier default: 525e96a66cSDavid du Colombier usage(); 535e96a66cSDavid du Colombier break; 545e96a66cSDavid du Colombier case 'D': 555e96a66cSDavid du Colombier Dflag ^= 1; 565e96a66cSDavid du Colombier break; 575e96a66cSDavid du Colombier case 'c': 585e96a66cSDavid du Colombier p = ARGF(); 595e96a66cSDavid du Colombier if(p == nil) 605e96a66cSDavid du Colombier usage(); 615e96a66cSDavid du Colombier cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); 625e96a66cSDavid du Colombier cmd[ncmd++] = p; 635e96a66cSDavid du Colombier break; 645e96a66cSDavid du Colombier case 't': 655e96a66cSDavid du Colombier tflag = 1; 665e96a66cSDavid du Colombier break; 675e96a66cSDavid du Colombier }ARGEND 685e96a66cSDavid du Colombier if(argc != 0) 695e96a66cSDavid du Colombier usage(); 705e96a66cSDavid du Colombier 715e96a66cSDavid du Colombier consInit(); 725e96a66cSDavid du Colombier cliInit(); 73*34e04225SDavid du Colombier msgInit(); 74*34e04225SDavid du Colombier conInit(); 755e96a66cSDavid du Colombier cmdInit(); 765e96a66cSDavid du Colombier fsysInit(); 775e96a66cSDavid du Colombier exclInit(); 785e96a66cSDavid du Colombier fidInit(); 795e96a66cSDavid du Colombier 805e96a66cSDavid du Colombier srvInit(); 815e96a66cSDavid du Colombier lstnInit(); 825e96a66cSDavid du Colombier usersInit(); 835e96a66cSDavid du Colombier 845e96a66cSDavid du Colombier for(i = 0; i < ncmd; i++){ 855e96a66cSDavid du Colombier if(cliExec(cmd[i]) == 0) 865e96a66cSDavid du Colombier break; 875e96a66cSDavid du Colombier } 885e96a66cSDavid du Colombier vtMemFree(cmd); 895e96a66cSDavid du Colombier 905e96a66cSDavid du Colombier if(tflag && consTTY() == 0) 915e96a66cSDavid du Colombier consPrint("%s\n", vtGetError()); 925e96a66cSDavid du Colombier 935e96a66cSDavid du Colombier vtDetach(); 945e96a66cSDavid du Colombier exits(0); 955e96a66cSDavid du Colombier } 96