per russ's suggestion, fix the option parsing of the nfsserver suite. Reference: /n/sources/patch/applied/nfsserver-opts-fix Date: Mon Apr 17 05:16:49 CES 2006 Signed-off-by: geoff@collyer.net --- /sys/src/cmd/9nfs/dat.h Mon Apr 17 05:14:20 2006 +++ /sys/src/cmd/9nfs/dat.h Mon Apr 17 05:14:17 2006 @@ -265,5 +265,6 @@ extern long starttime; extern long nfstime; extern char * config; -extern int staletime; +extern int staletime; extern int messagesize; +extern char * commonopts; --- /sys/src/cmd/9nfs/fns.h Mon Apr 17 05:14:32 2006 +++ /sys/src/cmd/9nfs/fns.h Mon Apr 17 05:14:30 2006 @@ -1,3 +1,4 @@ +int argopt(int c); int auth2unix(Auth*, Authunix*); int authhostowner(Session*); int canlock(Lock*); --- /sys/src/cmd/9nfs/pcnfsd.c Mon Apr 17 05:14:47 2006 +++ /sys/src/cmd/9nfs/pcnfsd.c Mon Apr 17 05:14:45 2006 @@ -48,6 +48,10 @@ case 'c': config = ARGF(); break; + default: + if(argopt(ARGC()) < 0) + sysfatal("usage: %s %s [-c config]", argv0, commonopts); + break; }ARGEND; clog("pc init\n"); --- /sys/src/cmd/9nfs/portmapper.c Mon Apr 17 05:15:06 2006 +++ /sys/src/cmd/9nfs/portmapper.c Mon Apr 17 05:15:03 2006 @@ -54,7 +54,12 @@ void pmapinit(int argc, char **argv) { - USED(argc, argv); + ARGBEGIN{ + default: + if(argopt(ARGC()) < 0) + sysfatal("usage: %s %s", argv0, commonopts); + break; + }ARGEND; clog("portmapper init\n"); } --- /sys/src/cmd/9nfs/nfsserver.c Mon Apr 17 05:15:35 2006 +++ /sys/src/cmd/9nfs/nfsserver.c Mon Apr 17 05:15:30 2006 @@ -79,6 +79,9 @@ void nfsinit(int argc, char **argv) { + /* + * mntinit will have already parsed our options. + */ USED(argc, argv); clog("nfs file server init\n"); rpcalarm = doalarm; --- /sys/src/cmd/9nfs/server.c Mon Apr 17 05:15:58 2006 +++ /sys/src/cmd/9nfs/server.c Mon Apr 17 05:15:55 2006 @@ -26,11 +26,48 @@ uchar rbuf[9000]; uchar resultbuf[9000]; +static int tcp; + +char *commonopts = "[-9CDrtv]"; /* for usage() messages */ + +/* + * this recognises common, nominally rcp-related options. + * they may not take arguments. + */ +int +argopt(int c) +{ + switch(c){ + case '9': + ++p9debug; + return 0; + case 'C': + ++nocache; + return 0; + case 'D': + ++rpcdebug; + return 0; + case 'r': + ++rejectall; + return 0; + case 't': + tcp = 1; + return 0; + case 'v': + ++chatty; + return 0; + default: + return -1; + } +} + +/* + * all option parsing is now done in (*pg->init)(), which can call back + * here to argopt for common options. + */ void server(int argc, char **argv, int myport, Progmap *progmap) { - int Argc=argc; char **Argv=argv; - int tcp = 0; Progmap *pg; fmtinstall('I', Iconv); @@ -45,26 +82,6 @@ case 0: break; } - ARGBEGIN{ - case '9': - ++p9debug; - break; - case 'r': - ++rejectall; - break; - case 'v': - ++chatty; - break; - case 'D': - ++rpcdebug; - break; - case 'C': - ++nocache; - break; - case 't': - tcp = 1; - break; - }ARGEND switch(rfork(RFMEM|RFPROC)){ case 0: @@ -77,7 +94,7 @@ } for(pg=progmap; pg->init; pg++) - (*pg->init)(Argc, Argv); + (*pg->init)(argc, argv); if(tcp) tcpserver(myport, progmap); else @@ -155,9 +172,9 @@ close(lctl); if(data < 0) exits(0); - + getendpoints((OUdphdr*)buf, ldir); - + for(;;){ if(servemsg(data, readtcp, writetcp, myport, progmap) < 0) break; @@ -314,7 +331,7 @@ n = atoi(serv); hnputs(port, n); } - + static void getendpoints(OUdphdr *ep, char *dir) { @@ -511,7 +528,7 @@ break; } } - return 0; + return 0; } #define MAXCACHE 64 @@ -529,7 +546,7 @@ if(ncache >= MAXCACHE){ if(rpcdebug) - fprint(2, "%s: drop %I/%ld, xid %uld, len %d\n", + fprint(2, "%s: drop %I/%ld, xid %uld, len %d\n", argv0, tail->host, tail->port, tail->xid, tail->n); tail = tail->prev; @@ -556,7 +573,7 @@ cp->n = len; memmove(cp->data, buf, len); if(rpcdebug) - fprint(2, "%s: cache %I/%ld, xid %uld, len %d\n", + fprint(2, "%s: cache %I/%ld, xid %uld, len %d\n", argv0, cp->host, cp->port, cp->xid, cp->n); } @@ -585,7 +602,7 @@ } (*writemsg)(fd, cp->data, cp->n); if(rpcdebug) - fprint(2, "%s: reply %I/%ld, xid %uld, len %d\n", + fprint(2, "%s: reply %I/%ld, xid %uld, len %d\n", argv0, cp->host, cp->port, cp->xid, cp->n); return 1; } @@ -597,7 +614,7 @@ ulong h; h = va_arg(f->args, ulong); - snprint(buf, sizeof buf, "%ld.%ld.%ld.%ld", + snprint(buf, sizeof buf, "%ld.%ld.%ld.%ld", (h>>24)&0xff, (h>>16)&0xff, (h>>8)&0xff, h&0xff); return fmtstrcpy(f, buf); --- /sys/src/cmd/9nfs/nfsmount.c Mon Apr 17 05:16:24 2006 +++ /sys/src/cmd/9nfs/nfsmount.c Mon Apr 17 05:16:21 2006 @@ -40,7 +40,6 @@ void mntinit(int argc, char **argv) { - char *argv0 = 0; int tries; config = "config"; @@ -69,9 +68,14 @@ case 'T': staletime = atoi(ARGF()); break; + default: + if(argopt(ARGC()) < 0) + sysfatal( +"usage: %s %s [-ns] [-a dialstring] [-f srvfile] [-c uidmap] [-T staletime]", + argv0, commonopts); + break; }ARGEND noauth=1; /* ZZZ */ - USED(argv0); if(tries == 0 && head == 0) srvinit(-1, 0, "il!bootes"); if(head == 0) @@ -149,7 +153,7 @@ xf = xfid("none", xp, 1); xf->urfid = f; clog("service=%s uid=%s fid=%ld\n", - s->service, xf->uid, xf->urfid-s->fids); + s->service, xf->uid, xf->urfid - s->fids); if(tail) tail->next = s; else @@ -200,7 +204,7 @@ argptr += string2S(argptr, &root); if(argptr != &((uchar *)cmd->args)[n]) return garbage(reply, "bad count"); - clog("host=%I, port=%ld, root=\"%.*s\"...", + clog("host=%I, port=%ld, root=\"%.*s\"...", cmd->host, cmd->port, utfnlen(root.s, root.n), root.s); if(auth2unix(&cmd->cred, &au) != 0){ chat("auth flavor=%ld, count=%ld\n",