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;
7b8a11165SDavid du Colombier int mempcnt; /* for 9fsys.c */
85e96a66cSDavid du Colombier char* none = "none";
91bdadbfaSDavid du Colombier char* foptname = "/none/such";
10fe853e23SDavid du Colombier
11*d7aba6c3SDavid du Colombier int mainstacksize = 16 * 1024;
12*d7aba6c3SDavid du Colombier
135e96a66cSDavid du Colombier static void
usage(void)145e96a66cSDavid du Colombier usage(void)
155e96a66cSDavid du Colombier {
16b8a11165SDavid du Colombier fprint(2, "usage: %s [-Dt] [-c cmd] [-f partition] [-m %%]\n", argv0);
17*d7aba6c3SDavid du Colombier threadexitsall("usage");
18dc5a79c1SDavid du Colombier }
19dc5a79c1SDavid du Colombier
20dc5a79c1SDavid du Colombier static void
readCmdPart(char * file,char *** pcmd,int * pncmd)21dc5a79c1SDavid du Colombier readCmdPart(char *file, char ***pcmd, int *pncmd)
22dc5a79c1SDavid du Colombier {
23dc5a79c1SDavid du Colombier char buf[1024+1], *f[1024];
24fe853e23SDavid du Colombier char tbuf[1024];
25dc5a79c1SDavid du Colombier int nf;
26dc5a79c1SDavid du Colombier int i, fd, n;
27fe853e23SDavid du Colombier char **cmd, *p;
28dc5a79c1SDavid du Colombier int ncmd;
29dc5a79c1SDavid du Colombier
30dc5a79c1SDavid du Colombier cmd = *pcmd;
31dc5a79c1SDavid du Colombier ncmd = *pncmd;
32dc5a79c1SDavid du Colombier
33dc5a79c1SDavid du Colombier if((fd = open(file, OREAD)) < 0)
34dc5a79c1SDavid du Colombier sysfatal("open %s: %r", file);
35dc5a79c1SDavid du Colombier if(seek(fd, 127*1024, 0) != 127*1024)
36dc5a79c1SDavid du Colombier sysfatal("seek %s 127kB: %r", file);
37dc5a79c1SDavid du Colombier n = readn(fd, buf, sizeof buf-1);
38dc5a79c1SDavid du Colombier if(n == 0)
39dc5a79c1SDavid du Colombier sysfatal("short read of %s at 127kB", file);
40dc5a79c1SDavid du Colombier if(n < 0)
41dc5a79c1SDavid du Colombier sysfatal("read %s: %r", file);
42dc5a79c1SDavid du Colombier buf[n] = 0;
43dc5a79c1SDavid du Colombier if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0)
44dc5a79c1SDavid du Colombier sysfatal("bad config magic in %s", file);
45dc5a79c1SDavid du Colombier nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n");
46dc5a79c1SDavid du Colombier for(i=0; i<nf; i++){
47dc5a79c1SDavid du Colombier if(f[i][0] == '#')
48dc5a79c1SDavid du Colombier continue;
49*d7aba6c3SDavid du Colombier cmd = vtrealloc(cmd, (ncmd+1)*sizeof(char*));
50fe853e23SDavid du Colombier /* expand argument '*' to mean current file */
51fe853e23SDavid du Colombier if((p = strchr(f[i], '*')) && (p==f[i]||isspace(p[-1])) && (p[1]==0||isspace(p[1]))){
52fe853e23SDavid du Colombier memmove(tbuf, f[i], p-f[i]);
53fe853e23SDavid du Colombier strecpy(tbuf+(p-f[i]), tbuf+sizeof tbuf, file);
54fe853e23SDavid du Colombier strecpy(tbuf+strlen(tbuf), tbuf+sizeof tbuf, p+1);
55fe853e23SDavid du Colombier f[i] = tbuf;
56fe853e23SDavid du Colombier }
57*d7aba6c3SDavid du Colombier cmd[ncmd++] = vtstrdup(f[i]);
58dc5a79c1SDavid du Colombier }
59dc5a79c1SDavid du Colombier close(fd);
60dc5a79c1SDavid du Colombier *pcmd = cmd;
61dc5a79c1SDavid du Colombier *pncmd = ncmd;
625e96a66cSDavid du Colombier }
635e96a66cSDavid du Colombier
645e96a66cSDavid du Colombier void
threadmain(int argc,char * argv[])65*d7aba6c3SDavid du Colombier threadmain(int argc, char* argv[])
665e96a66cSDavid du Colombier {
675e96a66cSDavid du Colombier char **cmd, *p;
685e96a66cSDavid du Colombier int i, ncmd, tflag;
695e96a66cSDavid du Colombier
705e96a66cSDavid du Colombier fmtinstall('D', dirfmt);
715e96a66cSDavid du Colombier fmtinstall('F', fcallfmt);
725e96a66cSDavid du Colombier fmtinstall('M', dirmodefmt);
735e96a66cSDavid du Colombier quotefmtinstall();
745e96a66cSDavid du Colombier
755e96a66cSDavid du Colombier /*
765e96a66cSDavid du Colombier * Insulate from the invoker's environment.
775e96a66cSDavid du Colombier */
785e96a66cSDavid du Colombier if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
795e96a66cSDavid du Colombier sysfatal("rfork: %r");
805e96a66cSDavid du Colombier
815e96a66cSDavid du Colombier close(0);
825e96a66cSDavid du Colombier open("/dev/null", OREAD);
835e96a66cSDavid du Colombier close(1);
845e96a66cSDavid du Colombier open("/dev/null", OWRITE);
855e96a66cSDavid du Colombier
865e96a66cSDavid du Colombier cmd = nil;
875e96a66cSDavid du Colombier ncmd = tflag = 0;
885e96a66cSDavid du Colombier
895e96a66cSDavid du Colombier ARGBEGIN{
905e96a66cSDavid du Colombier case '?':
915e96a66cSDavid du Colombier default:
925e96a66cSDavid du Colombier usage();
935e96a66cSDavid du Colombier break;
94b8a11165SDavid du Colombier case 'c':
95b8a11165SDavid du Colombier p = EARGF(usage());
96b8a11165SDavid du Colombier currfsysname = p;
97*d7aba6c3SDavid du Colombier cmd = vtrealloc(cmd, (ncmd+1)*sizeof(char*));
98b8a11165SDavid du Colombier cmd[ncmd++] = p;
99b8a11165SDavid du Colombier break;
1005e96a66cSDavid du Colombier case 'D':
1015e96a66cSDavid du Colombier Dflag ^= 1;
1025e96a66cSDavid du Colombier break;
103dc5a79c1SDavid du Colombier case 'f':
104dc5a79c1SDavid du Colombier p = EARGF(usage());
1051bdadbfaSDavid du Colombier currfsysname = foptname = p;
106dc5a79c1SDavid du Colombier readCmdPart(p, &cmd, &ncmd);
107dc5a79c1SDavid du Colombier break;
108b8a11165SDavid du Colombier case 'm':
109b8a11165SDavid du Colombier mempcnt = atoi(EARGF(usage()));
110b8a11165SDavid du Colombier if(mempcnt <= 0 || mempcnt >= 100)
111b8a11165SDavid du Colombier usage();
1125e96a66cSDavid du Colombier break;
1135e96a66cSDavid du Colombier case 't':
1145e96a66cSDavid du Colombier tflag = 1;
1155e96a66cSDavid du Colombier break;
1165e96a66cSDavid du Colombier }ARGEND
1175e96a66cSDavid du Colombier if(argc != 0)
1185e96a66cSDavid du Colombier usage();
1195e96a66cSDavid du Colombier
1205e96a66cSDavid du Colombier consInit();
1215e96a66cSDavid du Colombier cliInit();
12234e04225SDavid du Colombier msgInit();
12334e04225SDavid du Colombier conInit();
1245e96a66cSDavid du Colombier cmdInit();
1255e96a66cSDavid du Colombier fsysInit();
1265e96a66cSDavid du Colombier exclInit();
1275e96a66cSDavid du Colombier fidInit();
1285e96a66cSDavid du Colombier
1295e96a66cSDavid du Colombier srvInit();
1305e96a66cSDavid du Colombier lstnInit();
1315e96a66cSDavid du Colombier usersInit();
1325e96a66cSDavid du Colombier
133dc5a79c1SDavid du Colombier for(i = 0; i < ncmd; i++)
1345e96a66cSDavid du Colombier if(cliExec(cmd[i]) == 0)
135*d7aba6c3SDavid du Colombier fprint(2, "%s: %r\n", cmd[i]);
136*d7aba6c3SDavid du Colombier vtfree(cmd);
1375e96a66cSDavid du Colombier
1385e96a66cSDavid du Colombier if(tflag && consTTY() == 0)
139*d7aba6c3SDavid du Colombier consPrint("%r\n");
1405e96a66cSDavid du Colombier
141*d7aba6c3SDavid du Colombier threadexits(0);
1425e96a66cSDavid du Colombier }
143