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.
This commit is contained in:
parent
4e9f39a3ec
commit
e524e8d65a
7 changed files with 61 additions and 61 deletions
|
@ -4,7 +4,23 @@ exportfs, srvfs \- file server plumbing
|
|||
.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 @@ into a local file tree.
|
|||
.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.
|
||||
|
|
|
@ -10,18 +10,16 @@ int readonly;
|
|||
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");
|
||||
}
|
||||
|
||||
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 @@ main(int argc, char **argv)
|
|||
dbg++;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
dbfile = EARGF(usage());
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
messagesize = strtoul(EARGF(usage()), nil, 0);
|
||||
break;
|
||||
|
@ -82,13 +76,7 @@ main(int argc, char **argv)
|
|||
|
||||
exclusions();
|
||||
|
||||
if(dbg) {
|
||||
n = create(dbfile, OWRITE|OTRUNC, 0666);
|
||||
dup(n, DFD);
|
||||
close(n);
|
||||
}
|
||||
|
||||
DEBUG(DFD, "exportfs: started\n");
|
||||
DEBUG(2, "exportfs: started\n");
|
||||
|
||||
rfork(RFNOTEG|RFREND);
|
||||
|
||||
|
@ -106,13 +94,13 @@ main(int argc, char **argv)
|
|||
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();
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
*/
|
||||
|
||||
#define DEBUG if(!dbg){}else fprint
|
||||
#define DFD 9
|
||||
#define fidhash(s) fhash[s%FHASHSIZE]
|
||||
|
||||
typedef struct Fsrpc Fsrpc;
|
||||
|
|
|
@ -65,7 +65,7 @@ Xflush(Fsrpc *t)
|
|||
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 @@ Xflush(Fsrpc *t)
|
|||
}
|
||||
|
||||
reply(&t->work, &rhdr, 0);
|
||||
DEBUG(DFD, "\tflush reply\n");
|
||||
DEBUG(2, "\tflush reply\n");
|
||||
putsbuf(t);
|
||||
}
|
||||
|
||||
|
@ -359,7 +359,7 @@ Xremove(Fsrpc *t)
|
|||
}
|
||||
|
||||
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 @@ blockingslave(Proc *m)
|
|||
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 @@ slaveopen(Fsrpc *p)
|
|||
}
|
||||
|
||||
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 @@ slaveopen(Fsrpc *p)
|
|||
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 @@ slaveread(Fsrpc *p)
|
|||
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 @@ slavewrite(Fsrpc *p)
|
|||
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);
|
||||
|
|
|
@ -49,7 +49,7 @@ io(void)
|
|||
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 @@ reply(Fcall *r, Fcall *t, char *err)
|
|||
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 @@ freefile(File *f)
|
|||
|
||||
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 @@ file(File *parent, char *name)
|
|||
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 @@ uniqueqid(Dir *d)
|
|||
}
|
||||
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 @@ fatal(char *s, ...)
|
|||
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);
|
||||
|
|
|
@ -59,7 +59,7 @@ filter(int fd, char *cmd, char *host)
|
|||
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 @@ main(int argc, char **argv)
|
|||
|
||||
if(dbg) {
|
||||
n = create(dbfile, OWRITE|OTRUNC, 0666);
|
||||
dup(n, DFD);
|
||||
dup(n, 2);
|
||||
close(n);
|
||||
}
|
||||
|
||||
|
@ -265,7 +265,7 @@ main(int argc, char **argv)
|
|||
usage();
|
||||
}
|
||||
|
||||
DEBUG(DFD, "%s: started\n", argv0);
|
||||
DEBUG(2, "%s: started\n", argv0);
|
||||
|
||||
rfork(RFNOTEG|RFREND);
|
||||
|
||||
|
@ -289,10 +289,10 @@ main(int argc, char **argv)
|
|||
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,22 +301,22 @@ main(int argc, char **argv)
|
|||
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;
|
||||
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 @@ main(int argc, char **argv)
|
|||
|
||||
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();
|
||||
|
|
|
@ -42,7 +42,7 @@ exclusions(void)
|
|||
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 @@ exclusions(void)
|
|||
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 @@ excludefile(char *path)
|
|||
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 @@ preaddir(Fid *f, uchar *data, int n, vlong offset)
|
|||
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 @@ preaddir(Fid *f, uchar *data, int n, vlong offset)
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue