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