15e96a66cSDavid du Colombier #include "stdinc.h" 2fe853e23SDavid du Colombier #include <ctype.h> 35e96a66cSDavid du Colombier 45e96a66cSDavid du Colombier #include "9.h" 55e96a66cSDavid du Colombier 65e96a66cSDavid du Colombier int Dflag; 7*b8a11165SDavid du Colombier int mempcnt; /* for 9fsys.c */ 85e96a66cSDavid du Colombier char* none = "none"; 9fe853e23SDavid du Colombier 105e96a66cSDavid du Colombier static void 115e96a66cSDavid du Colombier usage(void) 125e96a66cSDavid du Colombier { 13*b8a11165SDavid du Colombier fprint(2, "usage: %s [-Dt] [-c cmd] [-f partition] [-m %%]\n", argv0); 14dc5a79c1SDavid du Colombier exits("usage"); 15dc5a79c1SDavid du Colombier } 16dc5a79c1SDavid du Colombier 17dc5a79c1SDavid du Colombier static void 18dc5a79c1SDavid du Colombier readCmdPart(char *file, char ***pcmd, int *pncmd) 19dc5a79c1SDavid du Colombier { 20dc5a79c1SDavid du Colombier char buf[1024+1], *f[1024]; 21fe853e23SDavid du Colombier char tbuf[1024]; 22dc5a79c1SDavid du Colombier int nf; 23dc5a79c1SDavid du Colombier int i, fd, n; 24fe853e23SDavid du Colombier char **cmd, *p; 25dc5a79c1SDavid du Colombier int ncmd; 26dc5a79c1SDavid du Colombier 27dc5a79c1SDavid du Colombier cmd = *pcmd; 28dc5a79c1SDavid du Colombier ncmd = *pncmd; 29dc5a79c1SDavid du Colombier 30dc5a79c1SDavid du Colombier if((fd = open(file, OREAD)) < 0) 31dc5a79c1SDavid du Colombier sysfatal("open %s: %r", file); 32dc5a79c1SDavid du Colombier if(seek(fd, 127*1024, 0) != 127*1024) 33dc5a79c1SDavid du Colombier sysfatal("seek %s 127kB: %r", file); 34dc5a79c1SDavid du Colombier n = readn(fd, buf, sizeof buf-1); 35dc5a79c1SDavid du Colombier if(n == 0) 36dc5a79c1SDavid du Colombier sysfatal("short read of %s at 127kB", file); 37dc5a79c1SDavid du Colombier if(n < 0) 38dc5a79c1SDavid du Colombier sysfatal("read %s: %r", file); 39dc5a79c1SDavid du Colombier buf[n] = 0; 40dc5a79c1SDavid du Colombier if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0) 41dc5a79c1SDavid du Colombier sysfatal("bad config magic in %s", file); 42dc5a79c1SDavid du Colombier nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n"); 43dc5a79c1SDavid du Colombier for(i=0; i<nf; i++){ 44dc5a79c1SDavid du Colombier if(f[i][0] == '#') 45dc5a79c1SDavid du Colombier continue; 46dc5a79c1SDavid du Colombier cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); 47fe853e23SDavid du Colombier /* expand argument '*' to mean current file */ 48fe853e23SDavid du Colombier if((p = strchr(f[i], '*')) && (p==f[i]||isspace(p[-1])) && (p[1]==0||isspace(p[1]))){ 49fe853e23SDavid du Colombier memmove(tbuf, f[i], p-f[i]); 50fe853e23SDavid du Colombier strecpy(tbuf+(p-f[i]), tbuf+sizeof tbuf, file); 51fe853e23SDavid du Colombier strecpy(tbuf+strlen(tbuf), tbuf+sizeof tbuf, p+1); 52fe853e23SDavid du Colombier f[i] = tbuf; 53fe853e23SDavid du Colombier } 54dc5a79c1SDavid du Colombier cmd[ncmd++] = vtStrDup(f[i]); 55dc5a79c1SDavid du Colombier } 56dc5a79c1SDavid du Colombier close(fd); 57dc5a79c1SDavid du Colombier *pcmd = cmd; 58dc5a79c1SDavid du Colombier *pncmd = ncmd; 595e96a66cSDavid du Colombier } 605e96a66cSDavid du Colombier 615e96a66cSDavid du Colombier void 625e96a66cSDavid du Colombier main(int argc, char* argv[]) 635e96a66cSDavid du Colombier { 645e96a66cSDavid du Colombier char **cmd, *p; 655e96a66cSDavid du Colombier int i, ncmd, tflag; 665e96a66cSDavid du Colombier 675e96a66cSDavid du Colombier fmtinstall('D', dirfmt); 685e96a66cSDavid du Colombier fmtinstall('F', fcallfmt); 695e96a66cSDavid du Colombier fmtinstall('M', dirmodefmt); 705e96a66cSDavid du Colombier quotefmtinstall(); 715e96a66cSDavid du Colombier 725e96a66cSDavid du Colombier /* 735e96a66cSDavid du Colombier * Insulate from the invoker's environment. 745e96a66cSDavid du Colombier */ 755e96a66cSDavid du Colombier if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0) 765e96a66cSDavid du Colombier sysfatal("rfork: %r"); 775e96a66cSDavid du Colombier 785e96a66cSDavid du Colombier close(0); 795e96a66cSDavid du Colombier open("/dev/null", OREAD); 805e96a66cSDavid du Colombier close(1); 815e96a66cSDavid du Colombier open("/dev/null", OWRITE); 825e96a66cSDavid du Colombier 835e96a66cSDavid du Colombier cmd = nil; 845e96a66cSDavid du Colombier ncmd = tflag = 0; 855e96a66cSDavid du Colombier 865e96a66cSDavid du Colombier vtAttach(); 875e96a66cSDavid du Colombier 885e96a66cSDavid du Colombier ARGBEGIN{ 895e96a66cSDavid du Colombier case '?': 905e96a66cSDavid du Colombier default: 915e96a66cSDavid du Colombier usage(); 925e96a66cSDavid du Colombier break; 93*b8a11165SDavid du Colombier case 'c': 94*b8a11165SDavid du Colombier p = EARGF(usage()); 95*b8a11165SDavid du Colombier currfsysname = p; 96*b8a11165SDavid du Colombier cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*)); 97*b8a11165SDavid du Colombier cmd[ncmd++] = p; 98*b8a11165SDavid du Colombier break; 995e96a66cSDavid du Colombier case 'D': 1005e96a66cSDavid du Colombier Dflag ^= 1; 1015e96a66cSDavid du Colombier break; 102dc5a79c1SDavid du Colombier case 'f': 103dc5a79c1SDavid du Colombier p = EARGF(usage()); 104*b8a11165SDavid du Colombier currfsysname = p; 105dc5a79c1SDavid du Colombier readCmdPart(p, &cmd, &ncmd); 106dc5a79c1SDavid du Colombier break; 107*b8a11165SDavid du Colombier case 'm': 108*b8a11165SDavid du Colombier mempcnt = atoi(EARGF(usage())); 109*b8a11165SDavid du Colombier if(mempcnt <= 0 || mempcnt >= 100) 110*b8a11165SDavid du Colombier usage(); 1115e96a66cSDavid du Colombier break; 1125e96a66cSDavid du Colombier case 't': 1135e96a66cSDavid du Colombier tflag = 1; 1145e96a66cSDavid du Colombier break; 1155e96a66cSDavid du Colombier }ARGEND 1165e96a66cSDavid du Colombier if(argc != 0) 1175e96a66cSDavid du Colombier usage(); 1185e96a66cSDavid du Colombier 1195e96a66cSDavid du Colombier consInit(); 1205e96a66cSDavid du Colombier cliInit(); 12134e04225SDavid du Colombier msgInit(); 12234e04225SDavid du Colombier conInit(); 1235e96a66cSDavid du Colombier cmdInit(); 1245e96a66cSDavid du Colombier fsysInit(); 1255e96a66cSDavid du Colombier exclInit(); 1265e96a66cSDavid du Colombier fidInit(); 1275e96a66cSDavid du Colombier 1285e96a66cSDavid du Colombier srvInit(); 1295e96a66cSDavid du Colombier lstnInit(); 1305e96a66cSDavid du Colombier usersInit(); 1315e96a66cSDavid du Colombier 132dc5a79c1SDavid du Colombier for(i = 0; i < ncmd; i++) 1335e96a66cSDavid du Colombier if(cliExec(cmd[i]) == 0) 134dc5a79c1SDavid du Colombier fprint(2, "%s: %R\n", cmd[i]); 1355e96a66cSDavid du Colombier vtMemFree(cmd); 1365e96a66cSDavid du Colombier 1375e96a66cSDavid du Colombier if(tflag && consTTY() == 0) 1385e96a66cSDavid du Colombier consPrint("%s\n", vtGetError()); 1395e96a66cSDavid du Colombier 1405e96a66cSDavid du Colombier vtDetach(); 1415e96a66cSDavid du Colombier exits(0); 1425e96a66cSDavid du Colombier } 143