123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
- */
- #include "stdinc.h"
- #include <ctype.h>
- #include "9.h"
- int Dflag;
- int mempcnt; /* for 9fsys.c */
- char* none = "none";
- char* foptname = "/none/such";
- static void
- usage(void)
- {
- fprint(2, "usage: %s [-Dt] [-c cmd] [-f partition] [-m %%]\n", argv0);
- exits("usage");
- }
- static void
- readCmdPart(char *file, char ***pcmd, int *pncmd)
- {
- char buf[1024+1], *f[1024];
- char tbuf[1024];
- int nf;
- int i, fd, n;
- char **cmd, *p;
- int ncmd;
- cmd = *pcmd;
- ncmd = *pncmd;
- if((fd = open(file, OREAD)) < 0)
- sysfatal("open %s: %r", file);
- if(seek(fd, 127*1024, 0) != 127*1024)
- sysfatal("seek %s 127kB: %r", file);
- n = readn(fd, buf, sizeof buf-1);
- if(n == 0)
- sysfatal("short read of %s at 127kB", file);
- if(n < 0)
- sysfatal("read %s: %r", file);
- buf[n] = 0;
- if(memcmp(buf, "fossil config\n", 6+1+6+1) != 0)
- sysfatal("bad config magic in %s", file);
- nf = getfields(buf+6+1+6+1, f, nelem(f), 1, "\n");
- for(i=0; i<nf; i++){
- if(f[i][0] == '#')
- continue;
- cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
- /* expand argument '*' to mean current file */
- if((p = strchr(f[i], '*')) && (p==f[i]||isspace(p[-1])) && (p[1]==0||isspace(p[1]))){
- memmove(tbuf, f[i], p-f[i]);
- strecpy(tbuf+(p-f[i]), tbuf+sizeof tbuf, file);
- strecpy(tbuf+strlen(tbuf), tbuf+sizeof tbuf, p+1);
- f[i] = tbuf;
- }
- cmd[ncmd++] = vtStrDup(f[i]);
- }
- close(fd);
- *pcmd = cmd;
- *pncmd = ncmd;
- }
- void
- main(int argc, char* argv[])
- {
- char **cmd, *p;
- int i, ncmd, tflag;
- fmtinstall('D', dirfmt);
- fmtinstall('F', fcallfmt);
- fmtinstall('M', dirmodefmt);
- quotefmtinstall();
- /*
- * Insulate from the invoker's environment.
- */
- if(rfork(RFREND|RFNOTEG|RFNAMEG) < 0)
- sysfatal("rfork: %r");
- close(0);
- open("/dev/null", OREAD);
- close(1);
- open("/dev/null", OWRITE);
- cmd = nil;
- ncmd = tflag = 0;
- vtAttach();
- ARGBEGIN{
- case '?':
- default:
- usage();
- break;
- case 'c':
- p = EARGF(usage());
- currfsysname = p;
- cmd = vtMemRealloc(cmd, (ncmd+1)*sizeof(char*));
- cmd[ncmd++] = p;
- break;
- case 'D':
- Dflag ^= 1;
- break;
- case 'f':
- p = EARGF(usage());
- currfsysname = foptname = p;
- readCmdPart(p, &cmd, &ncmd);
- break;
- case 'm':
- mempcnt = atoi(EARGF(usage()));
- if(mempcnt <= 0 || mempcnt >= 100)
- usage();
- break;
- case 't':
- tflag = 1;
- break;
- }ARGEND
- if(argc != 0)
- usage();
- consInit();
- cliInit();
- msgInit();
- conInit();
- cmdInit();
- fsysInit();
- exclInit();
- fidInit();
- srvInit();
- lstnInit();
- usersInit();
- for(i = 0; i < ncmd; i++)
- if(cliExec(cmd[i]) == 0)
- fprint(2, "%s: %R\n", cmd[i]);
- vtMemFree(cmd);
- if(tflag && consTTY() == 0)
- consPrint("%s\n", vtGetError());
- vtDetach();
- exits(0);
- }
|