1 #include "stdinc.h" 2 3 #include "9.h" 4 5 int Dflag; 6 char* none = "none"; 7 int stdfd[2]; 8 9 static void 10 usage(void) 11 { 12 fprint(2, "usage: %s" 13 " [-Dt]" 14 " [-c cmd]" 15 " [-f partition]" 16 , argv0); 17 exits("usage"); 18 } 19 20 static void 21 readCmdPart(char *file, char ***pcmd, int *pncmd) 22 { 23 char buf[1024+1], *f[1024]; 24 int nf; 25 int i, fd, n; 26 char **cmd; 27 int ncmd; 28 29 cmd = *pcmd; 30 ncmd = *pncmd; 31 32 if((fd = open(file, OREAD)) < 0) 33 sysfatal("open %s: %r", file); 34 if(seek(fd, 127*1024, 0) != 127*1024) 35 sysfatal("seek %s 127kB: %r", file); 36 n = readn(fd, buf, sizeof buf-1); 37 if(n == 0) 38 sysfatal("short read of %s at 127kB", file); 39 if(n < 0) 40 sysfatal("read %s: %r", file); 41 buf[n] = 0; 42 if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0) 43 sysfatal("bad config magic in %s", file); 44 nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n"); 45 for(i=0; i<nf; i++){ 46 if(f[i][0] == '#') 47 continue; 48 cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); 49 cmd[ncmd++] = vtStrDup(f[i]); 50 } 51 close(fd); 52 *pcmd = cmd; 53 *pncmd = ncmd; 54 } 55 56 void 57 main(int argc, char* argv[]) 58 { 59 char **cmd, *p; 60 int i, ncmd, tflag; 61 62 fmtinstall('D', dirfmt); 63 fmtinstall('F', fcallfmt); 64 fmtinstall('M', dirmodefmt); 65 quotefmtinstall(); 66 67 /* 68 * Insulate from the invoker's environment. 69 */ 70 if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0) 71 sysfatal("rfork: %r"); 72 73 close(0); 74 open("/dev/null", OREAD); 75 close(1); 76 open("/dev/null", OWRITE); 77 78 cmd = nil; 79 ncmd = tflag = 0; 80 81 vtAttach(); 82 83 ARGBEGIN{ 84 case '?': 85 default: 86 usage(); 87 break; 88 case 'D': 89 Dflag ^= 1; 90 break; 91 case 'f': 92 p = EARGF(usage()); 93 readCmdPart(p, &cmd, &ncmd); 94 break; 95 case 'c': 96 p = EARGF(usage()); 97 cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); 98 cmd[ncmd++] = p; 99 break; 100 case 't': 101 tflag = 1; 102 break; 103 }ARGEND 104 if(argc != 0) 105 usage(); 106 107 consInit(); 108 cliInit(); 109 msgInit(); 110 conInit(); 111 cmdInit(); 112 fsysInit(); 113 exclInit(); 114 fidInit(); 115 116 srvInit(); 117 lstnInit(); 118 usersInit(); 119 120 for(i = 0; i < ncmd; i++) 121 if(cliExec(cmd[i]) == 0) 122 fprint(2, "%s: %R\n", cmd[i]); 123 vtMemFree(cmd); 124 125 if(tflag && consTTY() == 0) 126 consPrint("%s\n", vtGetError()); 127 128 vtDetach(); 129 exits(0); 130 } 131