cwfs: fix network listener, relay auth errors. boot(8): split bootargs only on first ! char, prepare /net so cwfs can announce 9fs
This commit is contained in:
parent
064bce0841
commit
db7290d79e
7 changed files with 56 additions and 39 deletions
|
@ -70,20 +70,13 @@ fn main{
|
||||||
}
|
}
|
||||||
if not bootargs=$nobootprompt
|
if not bootargs=$nobootprompt
|
||||||
mn=`{echo $bootargs | awk -F! '{print $1}'}
|
mn=`{echo $bootargs | awk -F! '{print $1}'}
|
||||||
ma=`{echo $bootargs | awk -F! '{print $2}'}
|
ma=`{echo $bootargs | sed 's/[^!]+!//'}
|
||||||
for(i in `{seq 1 $#mt}){
|
for(i in `{seq 1 $#mt}){
|
||||||
if(~ $mt($i) m^$mn)
|
if(~ $mt($i) m^$mn)
|
||||||
mp=$$mt($i)
|
mp=$$mt($i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch($mn){
|
|
||||||
case local
|
|
||||||
islocal=1
|
|
||||||
case hybrid
|
|
||||||
ishybrid=1
|
|
||||||
}
|
|
||||||
|
|
||||||
# config method
|
# config method
|
||||||
$mp(1) $ma
|
$mp(1) $ma
|
||||||
|
|
||||||
|
@ -149,6 +142,10 @@ if(! ~ $#kbmap 0){
|
||||||
cat $"kbmap >/dev/kbmap
|
cat $"kbmap >/dev/kbmap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# bind in an ip interface
|
||||||
|
for(i in I l`{seq 0 3})
|
||||||
|
bind -qa '#'$i /net
|
||||||
|
|
||||||
configlocal # add partitions and binds
|
configlocal # add partitions and binds
|
||||||
|
|
||||||
while(){
|
while(){
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
#!/bin/rc
|
#!/bin/rc
|
||||||
|
|
||||||
fn configtcp{
|
fn configtcp{
|
||||||
# bind in an ip interface
|
|
||||||
for(i in I l`{seq 0 3})
|
|
||||||
bind -qa '#'$i /net
|
|
||||||
|
|
||||||
must ip/ipconfig -p $*
|
must ip/ipconfig -p $*
|
||||||
|
|
||||||
if(~ $#fs 0)
|
if(~ $#fs 0)
|
||||||
|
|
|
@ -242,7 +242,7 @@ authorize(Chan* chan, Fcall* f)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fake read to get auth info */
|
/* fake read to get auth info */
|
||||||
authread(af, nil, 0);
|
authread(chan, af, nil, 0);
|
||||||
uid = af->uid;
|
uid = af->uid;
|
||||||
if(db)
|
if(db)
|
||||||
print("authorize: uid is %d\n", uid);
|
print("authorize: uid is %d\n", uid);
|
||||||
|
@ -1001,7 +1001,7 @@ fs_read(Chan* chan, Fcall* f, Fcall* r, uchar* data)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if(file->qid.type & QTAUTH){
|
if(file->qid.type & QTAUTH){
|
||||||
nread = authread(file, (uchar*)data, count);
|
nread = authread(chan, file, (uchar*)data, count);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
error = Eauth2;
|
error = Eauth2;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1198,7 +1198,7 @@ fs_write(Chan* chan, Fcall* f, Fcall* r)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(file->qid.type & QTAUTH){
|
if(file->qid.type & QTAUTH){
|
||||||
nwrite = authwrite(file, (uchar*)f->data, count);
|
nwrite = authwrite(chan, file, (uchar*)f->data, count);
|
||||||
if(nwrite < 0)
|
if(nwrite < 0)
|
||||||
error = Eauth2;
|
error = Eauth2;
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1733,6 +1733,7 @@ print("didn't like %d byte message\n", mb->count);
|
||||||
r.tag = f.tag;
|
r.tag = f.tag;
|
||||||
error = 0;
|
error = 0;
|
||||||
data = nil;
|
data = nil;
|
||||||
|
chan->err[0] = 0;
|
||||||
|
|
||||||
switch(type){
|
switch(type){
|
||||||
default:
|
default:
|
||||||
|
@ -1786,7 +1787,9 @@ print("didn't like %d byte message\n", mb->count);
|
||||||
|
|
||||||
if(error != 0){
|
if(error != 0){
|
||||||
r.type = Rerror;
|
r.type = Rerror;
|
||||||
if(error >= MAXERR){
|
if(chan->err[0])
|
||||||
|
r.ename = chan->err;
|
||||||
|
else if(error >= MAXERR){
|
||||||
snprint(ename, sizeof(ename), "error %d", error);
|
snprint(ename, sizeof(ename), "error %d", error);
|
||||||
r.ename = ename;
|
r.ename = ename;
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -119,43 +119,62 @@ authfree(void *auth)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
authread(File *file, uchar *data, int count)
|
authread(Chan *chan, File *file, uchar *data, int count)
|
||||||
{
|
{
|
||||||
AuthInfo *ai;
|
AuthInfo *ai;
|
||||||
AuthRpc *rpc;
|
AuthRpc *rpc;
|
||||||
|
|
||||||
if((rpc = file->auth) == nil)
|
if((rpc = file->auth) == nil){
|
||||||
|
snprint(chan->err, sizeof(chan->err),
|
||||||
|
"not an auth fid");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
switch(auth_rpc(rpc, "read", nil, 0)){
|
switch(auth_rpc(rpc, "read", nil, 0)){
|
||||||
|
default:
|
||||||
|
snprint(chan->err, sizeof(chan->err),
|
||||||
|
"authread: auth protocol not finished");
|
||||||
|
return -1;
|
||||||
case ARdone:
|
case ARdone:
|
||||||
if((ai = auth_getinfo(rpc)) == nil)
|
if((ai = auth_getinfo(rpc)) == nil)
|
||||||
return -1;
|
goto Phase;
|
||||||
file->uid = strtouid(ai->cuid);
|
file->uid = strtouid(ai->cuid);
|
||||||
auth_freeAI(ai);
|
auth_freeAI(ai);
|
||||||
if(file->uid < 0)
|
if(file->uid < 0){
|
||||||
|
snprint(chan->err, sizeof(chan->err),
|
||||||
|
"unknown user '%s'", ai->cuid);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case ARok:
|
case ARok:
|
||||||
if(count < rpc->narg)
|
if(count < rpc->narg){
|
||||||
|
snprint(chan->err, sizeof(chan->err),
|
||||||
|
"not enough data in auth read");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
memmove(data, rpc->arg, rpc->narg);
|
memmove(data, rpc->arg, rpc->narg);
|
||||||
return rpc->narg;
|
return rpc->narg;
|
||||||
case ARphase:
|
case ARphase:
|
||||||
return -1;
|
Phase:
|
||||||
default:
|
rerrstr(chan->err, sizeof(chan->err));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
authwrite(File *file, uchar *data, int count)
|
authwrite(Chan *chan, File *file, uchar *data, int count)
|
||||||
{
|
{
|
||||||
AuthRpc *rpc;
|
AuthRpc *rpc;
|
||||||
|
|
||||||
if((rpc = file->auth) == nil)
|
if((rpc = file->auth) == nil){
|
||||||
|
snprint(chan->err, sizeof(chan->err),
|
||||||
|
"not an auth fid");
|
||||||
return -1;
|
return -1;
|
||||||
if(auth_rpc(rpc, "write", data, count) != ARok)
|
}
|
||||||
|
if(auth_rpc(rpc, "write", data, count) != ARok){
|
||||||
|
rerrstr(chan->err, sizeof(chan->err));
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,19 +54,18 @@ neti(void *v)
|
||||||
Network *net;
|
Network *net;
|
||||||
|
|
||||||
net = v;
|
net = v;
|
||||||
print("net%di\n", net->ctlrno);
|
if(chatty)
|
||||||
Listen:
|
print("net%di\n", net->ctlrno);
|
||||||
if((lisfd = listen(net->anndir, net->lisdir)) < 0){
|
|
||||||
print("listen %s failed: %r\n", net->anndir);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for(;;) {
|
for(;;) {
|
||||||
|
if((lisfd = listen(net->anndir, net->lisdir)) < 0){
|
||||||
|
fprint(2, "listen %s failed: %r\n", net->anndir);
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* got new call on lisfd */
|
/* got new call on lisfd */
|
||||||
if((accfd = accept(lisfd, net->lisdir)) < 0){
|
if((accfd = accept(lisfd, net->lisdir)) < 0){
|
||||||
print("accept %d (from %s) failed: %r\n",
|
fprint(2, "accept %d (from %s) failed: %r\n", lisfd, net->lisdir);
|
||||||
lisfd, net->lisdir);
|
|
||||||
close(lisfd);
|
close(lisfd);
|
||||||
goto Listen;
|
continue;
|
||||||
}
|
}
|
||||||
nci = getnetconninfo(net->lisdir, accfd);
|
nci = getnetconninfo(net->lisdir, accfd);
|
||||||
srvchan(accfd, nci->raddr);
|
srvchan(accfd, nci->raddr);
|
||||||
|
@ -97,10 +96,11 @@ netinit(void)
|
||||||
if(net->dialstr == nil)
|
if(net->dialstr == nil)
|
||||||
continue;
|
continue;
|
||||||
if((net->annfd = announce(net->dialstr, net->anndir)) < 0){
|
if((net->annfd = announce(net->dialstr, net->anndir)) < 0){
|
||||||
print("can't announce %s: %r", net->dialstr);
|
fprint(2, "can't announce %s: %r", net->dialstr);
|
||||||
net->dialstr = nil;
|
net->dialstr = nil;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
print("netinit: announced on %s\n", net->dialstr);
|
if(chatty)
|
||||||
|
print("netinit: announced on %s\n", net->dialstr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -267,6 +267,8 @@ struct Chan
|
||||||
uchar authinfo[64];
|
uchar authinfo[64];
|
||||||
|
|
||||||
void* pdata; /* sometimes is a Netconn* */
|
void* pdata; /* sometimes is a Netconn* */
|
||||||
|
|
||||||
|
char err[ERRMAX];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Filsys
|
struct Filsys
|
||||||
|
|
|
@ -4,8 +4,8 @@ void arpstart(void);
|
||||||
void arginit(void);
|
void arginit(void);
|
||||||
void* authnew(void);
|
void* authnew(void);
|
||||||
void authfree(void*);
|
void authfree(void*);
|
||||||
int authread(File*, uchar*, int);
|
int authread(Chan*, File*, uchar*, int);
|
||||||
int authwrite(File*, uchar*, int);
|
int authwrite(Chan*, File*, uchar*, int);
|
||||||
void cdiag(char*, int);
|
void cdiag(char*, int);
|
||||||
int cnumb(void);
|
int cnumb(void);
|
||||||
Device* config(void);
|
Device* config(void);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue