ref: e524e8d65a7573c46d7beb49e77bfc2d55a5563d
parent: 4e9f39a3ec0712542af0d035c79b3bf0eb2f2cd3
author: amavect <amavect@gmail.com>
date: Sat Aug 14 15:50:23 EDT 2021
exportfs: make -d log to stderr exportfs -d logs 9p traffic to /tmp/exportdb. -f allows writing to a different file. exportfs silently continues if it doesn't have permissions to create or write to /tmp/exportdb. These are poor behaviors. A better default is to write to stderr, since it is 9P debug info that is better immediately printed, and not user info that is better handled by syslog(). As a result, -f is obsolete and thus removed. Redirect responsibility is now on rc. As a side effect, rc will fail if it doesn't have permissions to write. exportfs(4) is updated to reflect all changes and with a better Synopsis.
--- a/sys/man/4/exportfs
+++ b/sys/man/4/exportfs
@@ -4,8 +4,24 @@
.SH SYNOPSIS
.B exportfs
[
-.I options
+.B -dsR
]
+[
+.B -m
+.I msize
+]
+[
+.B -r
+.I root
+]
+[
+.B -P
+.I patternfile
+]
+[
+.B -S
+.I srvfile
+]
.PP
.B srvfs
[
@@ -39,11 +55,8 @@
.PP
The options are:
.TP
-.B -d -f \fIdbgfile
-Log all 9P traffic to
-.I dbgfile
-(default
-.BR /tmp/exportdb ).
+.B -d
+Log all 9P traffic to stderr.
.TP
.B -P \fIpatternfile
Restrict the set of exported files.
--- a/sys/src/cmd/exportfs/exportfs.c
+++ b/sys/src/cmd/exportfs/exportfs.c
@@ -10,8 +10,8 @@
void
usage(void)
{
- fprint(2, "usage: %s [-dsR] [-f dbgfile] [-m msize] [-r root] "
- "[-S srvfile] [-P exclusion-file]\n", argv0);
+ fprint(2, "usage: %s [-dsR] [-m msize] [-r root] "
+ "[-P patternfile] [-S srvfile]\n", argv0);
fatal("usage");
}
@@ -18,10 +18,8 @@
void
main(int argc, char **argv)
{
- char *dbfile, *srv, *srvfdfile;
- int n;
+ char *srv, *srvfdfile;
- dbfile = "/tmp/exportdb";
srv = nil;
srvfd = -1;
srvfdfile = nil;
@@ -31,10 +29,6 @@
dbg++;
break;
- case 'f':
- dbfile = EARGF(usage());
- break;
-
case 'm':
messagesize = strtoul(EARGF(usage()), nil, 0);
break;
@@ -82,14 +76,8 @@
exclusions();
- if(dbg) {
- n = create(dbfile, OWRITE|OTRUNC, 0666);
- dup(n, DFD);
- close(n);
- }
+ DEBUG(2, "exportfs: started\n");
- DEBUG(DFD, "exportfs: started\n");
-
rfork(RFNOTEG|RFREND);
if(messagesize == 0){
@@ -106,13 +94,13 @@
char ebuf[ERRMAX];
ebuf[0] = '\0';
errstr(ebuf, sizeof ebuf);
- DEBUG(DFD, "chdir(\"%s\"): %s\n", srv, ebuf);
+ DEBUG(2, "chdir(\"%s\"): %s\n", srv, ebuf);
mounterror(ebuf);
}
- DEBUG(DFD, "invoked as server for %s", srv);
+ DEBUG(2, "invoked as server for %s", srv);
}
- DEBUG(DFD, "\niniting root\n");
+ DEBUG(2, "\niniting root\n");
initroot();
io();
}
--- a/sys/src/cmd/exportfs/exportfs.h
+++ b/sys/src/cmd/exportfs/exportfs.h
@@ -3,7 +3,6 @@
*/
#define DEBUG if(!dbg){}else fprint
-#define DFD 9
#define fidhash(s) fhash[s%FHASHSIZE]
typedef struct Fsrpc Fsrpc;
--- a/sys/src/cmd/exportfs/exportsrv.c
+++ b/sys/src/cmd/exportfs/exportsrv.c
@@ -65,7 +65,7 @@
w = m->busy;
if(w != nil && w->work.tag == t->work.oldtag) {
w->flushtag = t->work.tag;
- DEBUG(DFD, "\tset flushtag %d\n", t->work.tag);
+ DEBUG(2, "\tset flushtag %d\n", t->work.tag);
postnote(PNPROC, m->pid, "flush");
unlock(m);
putsbuf(t);
@@ -75,7 +75,7 @@
}
reply(&t->work, &rhdr, 0);
- DEBUG(DFD, "\tflush reply\n");
+ DEBUG(2, "\tflush reply\n");
putsbuf(t);
}
@@ -359,7 +359,7 @@
}
path = makepath(f->f, "");
- DEBUG(DFD, "\tremove: %s\n", path);
+ DEBUG(2, "\tremove: %s\n", path);
if(remove(path) < 0) {
free(path);
errstr(err, sizeof err);
@@ -518,7 +518,7 @@
if(p == nil) /* Swept */
break;
- DEBUG(DFD, "\tslave: %d %F\n", m->pid, &p->work);
+ DEBUG(2, "\tslave: %d %F\n", m->pid, &p->work);
if(p->flushtag != NOTAG)
goto flushme;
@@ -629,7 +629,7 @@
}
path = makepath(f->f, "");
- DEBUG(DFD, "\topen: %s %d\n", path, work->mode);
+ DEBUG(2, "\topen: %s %d\n", path, work->mode);
f->fid = open(path, work->mode);
free(path);
if(f->fid < 0 || (d = dirfstat(f->fid)) == nil) {
@@ -646,7 +646,7 @@
goto Error;
}
- DEBUG(DFD, "\topen: fd %d\n", f->fid);
+ DEBUG(2, "\topen: fd %d\n", f->fid);
f->mode = work->mode;
f->offset = 0;
rhdr.iounit = getiounit(f->fid);
@@ -688,7 +688,7 @@
reply(work, &rhdr, err);
return;
}
- DEBUG(DFD, "\tread: fd=%d %d bytes\n", f->fid, r);
+ DEBUG(2, "\tread: fd=%d %d bytes\n", f->fid, r);
rhdr.data = data;
rhdr.count = r;
@@ -720,7 +720,7 @@
return;
}
- DEBUG(DFD, "\twrite: %d bytes fd=%d\n", n, f->fid);
+ DEBUG(2, "\twrite: %d bytes fd=%d\n", n, f->fid);
rhdr.count = n;
reply(work, &rhdr, 0);
--- a/sys/src/cmd/exportfs/io.c
+++ b/sys/src/cmd/exportfs/io.c
@@ -49,7 +49,7 @@
if(convM2S(r->buf, n, &r->work) != n)
fatal("convM2S format error");
- DEBUG(DFD, "%F\n", &r->work);
+ DEBUG(2, "%F\n", &r->work);
(fcalls[r->work.type])(r);
}
}
@@ -69,7 +69,7 @@
else
t->type = r->type + 1;
- DEBUG(DFD, "\t%F\n", t);
+ DEBUG(2, "\t%F\n", t);
data = malloc(messagesize); /* not mallocz; no need to clear */
if(data == nil)
@@ -224,7 +224,7 @@
while(--f->ref == 0){
freecnt++;
- DEBUG(DFD, "free %s\n", f->name);
+ DEBUG(2, "free %s\n", f->name);
/* delete from parent */
parent = f->parent;
if(parent->child == f)
@@ -250,7 +250,7 @@
char *path;
File *f;
- DEBUG(DFD, "\tfile: 0x%p %s name %s\n", parent, parent->name, name);
+ DEBUG(2, "\tfile: 0x%p %s name %s\n", parent, parent->name, name);
path = makepath(parent, name);
if(patternfile != nil && excludefile(path)){
@@ -429,17 +429,17 @@
}
path = d->qid.path;
while(qidexists(path)){
- DEBUG(DFD, "collision on %s\n", d->name);
+ DEBUG(2, "collision on %s\n", d->name);
/* collision: find a new one */
ncollision++;
path &= QIDPATH;
++newqid;
if(newqid >= (1<<16)){
- DEBUG(DFD, "collision wraparound\n");
+ DEBUG(2, "collision wraparound\n");
newqid = 1;
}
path |= newqid<<48;
- DEBUG(DFD, "assign qid %.16llux\n", path);
+ DEBUG(2, "assign qid %.16llux\n", path);
}
qidcnt++;
q = emallocz(sizeof(Qidtab));
@@ -472,7 +472,7 @@
postnote(PNPROC, m->pid, "kill");
if(s != nil) {
- DEBUG(DFD, "%s\n", buf);
+ DEBUG(2, "%s\n", buf);
sysfatal("%s", buf); /* caution: buf could contain '%' */
} else
exits(nil);
--- a/sys/src/cmd/exportfs/oexportfs.c
+++ b/sys/src/cmd/exportfs/oexportfs.c
@@ -59,7 +59,7 @@
strecpy(strrchr(addr, '!'), addr+sizeof(addr), s);
}
- DEBUG(DFD, "filter: %s\n", addr);
+ DEBUG(2, "filter: %s\n", addr);
snprint(buf, sizeof(buf), "%s", cmd);
argc = tokenize(buf, argv, nelem(argv)-3);
@@ -256,7 +256,7 @@
if(dbg) {
n = create(dbfile, OWRITE|OTRUNC, 0666);
- dup(n, DFD);
+ dup(n, 2);
close(n);
}
@@ -265,7 +265,7 @@
usage();
}
- DEBUG(DFD, "%s: started\n", argv0);
+ DEBUG(2, "%s: started\n", argv0);
rfork(RFNOTEG|RFREND);
@@ -289,10 +289,10 @@
if(chdir(srv) < 0) {
ebuf[0] = '\0';
errstr(ebuf, sizeof ebuf);
- DEBUG(DFD, "chdir(\"%s\"): %s\n", srv, ebuf);
+ DEBUG(2, "chdir(\"%s\"): %s\n", srv, ebuf);
mounterror(ebuf);
}
- DEBUG(DFD, "invoked as server for %s", srv);
+ DEBUG(2, "invoked as server for %s", srv);
strncpy(buf, srv, sizeof buf);
}
else {
@@ -301,7 +301,7 @@
if(n < 0) {
errstr(buf, sizeof buf);
fprint(0, "read(0): %s\n", buf);
- DEBUG(DFD, "read(0): %s\n", buf);
+ DEBUG(2, "read(0): %s\n", buf);
exits(buf);
}
buf[n] = 0;
@@ -308,15 +308,15 @@
if(chdir(buf) < 0) {
errstr(ebuf, sizeof ebuf);
fprint(0, "chdir(%d:\"%s\"): %s\n", n, buf, ebuf);
- DEBUG(DFD, "chdir(%d:\"%s\"): %s\n", n, buf, ebuf);
+ DEBUG(2, "chdir(%d:\"%s\"): %s\n", n, buf, ebuf);
exits(ebuf);
}
}
- DEBUG(DFD, "\niniting root\n");
+ DEBUG(2, "\niniting root\n");
initroot();
- DEBUG(DFD, "%s: %s\n", argv0, buf);
+ DEBUG(2, "%s: %s\n", argv0, buf);
if(srv == nil && srvfd == -1 && write(0, "OK", 2) != 2)
fatal("open ack write");
@@ -436,7 +436,7 @@
if(convM2S(r->buf, n, &r->work) != n)
fatal("convM2S format error");
- DEBUG(DFD, "%F\n", &r->work);
+ DEBUG(2, "%F\n", &r->work);
(fcalls[r->work.type])(r);
}
io();
--- a/sys/src/cmd/exportfs/pattern.c
+++ b/sys/src/cmd/exportfs/pattern.c
@@ -42,7 +42,7 @@
if(include == nil)
fatal("out of memory");
}
- DEBUG(DFD, "\tinclude %s\n", line+2);
+ DEBUG(2, "\tinclude %s\n", line+2);
include[ni] = regcomp(line+2);
include[++ni] = nil;
break;
@@ -53,12 +53,12 @@
if(exclude == nil)
fatal("out of memory");
}
- DEBUG(DFD, "\texclude %s\n", line+2);
+ DEBUG(2, "\texclude %s\n", line+2);
exclude[ne] = regcomp(line+2);
exclude[++ne] = nil;
break;
default:
- DEBUG(DFD, "ignoring pattern %s\n", line);
+ DEBUG(2, "ignoring pattern %s\n", line);
break;
}
}
@@ -76,16 +76,16 @@
else
p = path+1;
- DEBUG(DFD, "checking %s\n", p);
+ DEBUG(2, "checking %s\n", p);
for(re = include; *re != nil; re++){
if(regexec(*re, p, nil, 0) != 1){
- DEBUG(DFD, "excluded+ %s\n", p);
+ DEBUG(2, "excluded+ %s\n", p);
return -1;
}
}
for(re = exclude; *re != nil; re++){
if(regexec(*re, p, nil, 0) == 1){
- DEBUG(DFD, "excluded- %s\n", p);
+ DEBUG(2, "excluded- %s\n", p);
return -1;
}
}
@@ -98,7 +98,7 @@
int r = 0, m;
Dir *d;
- DEBUG(DFD, "\tpreaddir n=%d wo=%lld fo=%lld\n", n, offset, f->offset);
+ DEBUG(2, "\tpreaddir n=%d wo=%lld fo=%lld\n", n, offset, f->offset);
if(offset == 0 && f->offset != 0){
if(seek(f->fid, 0, 0) != 0)
return -1;
@@ -128,9 +128,9 @@
free(p);
}
m = convD2M(d, data, n);
- DEBUG(DFD, "\t\tconvD2M %d\n", m);
+ DEBUG(2, "\t\tconvD2M %d\n", m);
if(m <= BIT16SZ){
- DEBUG(DFD, "\t\t\tneeded %d\n", GBIT16(data));
+ DEBUG(2, "\t\t\tneeded %d\n", GBIT16(data));
/* not enough room for full entry; leave for next time */
f->cdir--;
return r;