cwfs: set whochan for who command, cleanup
This commit is contained in:
parent
55959acbdf
commit
53f5bdfd06
6 changed files with 42 additions and 49 deletions
|
@ -342,11 +342,8 @@ cmd_hangup(int argc, char *argv[])
|
||||||
print("that chan is hung up\n");
|
print("that chan is hung up\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(cp->chan == n) {
|
if(cp->chan == n)
|
||||||
/* need more than just fileinit with tcp */
|
chanhangup(cp, "console command");
|
||||||
chanhangup(cp, "console command", 1);
|
|
||||||
fileinit(cp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -539,7 +539,7 @@ sysinit(void)
|
||||||
Fspar *fsp;
|
Fspar *fsp;
|
||||||
Iobuf *p;
|
Iobuf *p;
|
||||||
|
|
||||||
cons.chan = fs_chaninit(Devcon, 1, 0);
|
cons.chan = fs_chaninit(1, 0);
|
||||||
|
|
||||||
start:
|
start:
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -246,7 +246,6 @@ struct Hiob
|
||||||
/* a 9P connection */
|
/* a 9P connection */
|
||||||
struct Chan
|
struct Chan
|
||||||
{
|
{
|
||||||
char type; /* major driver type i.e. Dev* */
|
|
||||||
int (*protocol)(Msgbuf*); /* version */
|
int (*protocol)(Msgbuf*); /* version */
|
||||||
int msize; /* version */
|
int msize; /* version */
|
||||||
char whochan[50];
|
char whochan[50];
|
||||||
|
@ -683,7 +682,6 @@ enum
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
Devnone = 0,
|
Devnone = 0,
|
||||||
Devcon, /* console */
|
|
||||||
Devwren, /* disk drive */
|
Devwren, /* disk drive */
|
||||||
Devworm, /* scsi optical drive */
|
Devworm, /* scsi optical drive */
|
||||||
Devlworm, /* scsi optical drive (labeled) */
|
Devlworm, /* scsi optical drive (labeled) */
|
||||||
|
@ -698,7 +696,6 @@ enum
|
||||||
Devfloppy, /* floppy drive */
|
Devfloppy, /* floppy drive */
|
||||||
Devswab, /* swab data between mem and device */
|
Devswab, /* swab data between mem and device */
|
||||||
Devmirr, /* mirror devices */
|
Devmirr, /* mirror devices */
|
||||||
Devsrv, /* pipes and network connections */
|
|
||||||
MAXDEV
|
MAXDEV
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,8 @@ int byuid(void*, void*);
|
||||||
int canlock(Lock*);
|
int canlock(Lock*);
|
||||||
int canqlock(QLock*);
|
int canqlock(QLock*);
|
||||||
void cfsdump(Filsys*);
|
void cfsdump(Filsys*);
|
||||||
void chanhangup(Chan *cp, char *msg, int dolock);
|
void chanhangup(Chan *cp, char *msg);
|
||||||
Chan* fs_chaninit(int, int, int);
|
Chan* fs_chaninit(int, int);
|
||||||
void cmd_check(int, char*[]);
|
void cmd_check(int, char*[]);
|
||||||
void cmd_users(int, char*[]);
|
void cmd_users(int, char*[]);
|
||||||
void cmd_newuser(int, char*[]);
|
void cmd_newuser(int, char*[]);
|
||||||
|
|
|
@ -5,43 +5,47 @@
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
Maxfdata = 8192,
|
Maxfdata = 8192,
|
||||||
Nqueue = 200, /* queue size (tunable) */
|
Nqueue = 200, /* queue size (tunable) */
|
||||||
Nsrvo = 8, /* number of write workers */
|
Nsrvo = 8, /* number of write workers */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Srv Srv;
|
typedef struct Srv Srv;
|
||||||
struct Srv
|
struct Srv
|
||||||
{
|
{
|
||||||
Ref;
|
Ref;
|
||||||
char *name;
|
|
||||||
Chan *chan;
|
Chan *chan;
|
||||||
int fd;
|
int fd;
|
||||||
char buf[64];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
Lock;
|
Lock;
|
||||||
Chan *hd;
|
Chan *hd;
|
||||||
} freechans;
|
} freechans;
|
||||||
|
|
||||||
static Queue *srvoq;
|
static Queue *srvoq;
|
||||||
|
|
||||||
void
|
void
|
||||||
chanhangup(Chan *chan, char *msg, int dolock)
|
chanhangup(Chan *chan, char *msg)
|
||||||
{
|
{
|
||||||
|
char buf[128], *p;
|
||||||
Srv *srv;
|
Srv *srv;
|
||||||
|
int cfd;
|
||||||
USED(dolock);
|
|
||||||
USED(msg);
|
|
||||||
|
|
||||||
fileinit(chan);
|
fileinit(chan);
|
||||||
if(chan->type != Devsrv)
|
|
||||||
return;
|
|
||||||
srv = chan->pdata;
|
srv = chan->pdata;
|
||||||
if(srv == nil || srv->chan != chan)
|
if(chan == cons.chan || srv == nil || srv->chan != chan)
|
||||||
return;
|
return;
|
||||||
close(srv->fd);
|
if(msg[0] && chatty)
|
||||||
srv->fd = -1;
|
print("hangup %s: %s\n", chan->whochan, msg);
|
||||||
|
if(fd2path(srv->fd, buf, sizeof(buf)) == 0){
|
||||||
|
if(p = strrchr(buf, '/')){
|
||||||
|
strecpy(p, buf+sizeof(buf), "/ctl");
|
||||||
|
if((cfd = open(buf, OWRITE)) >= 0){
|
||||||
|
write(cfd, "hangup", 6);
|
||||||
|
close(cfd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -52,12 +56,12 @@ srvput(Srv *srv)
|
||||||
if(decref(srv))
|
if(decref(srv))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(chatty)
|
close(srv->fd);
|
||||||
print("%s closed\n", srv->name);
|
srv->fd = -1;
|
||||||
|
|
||||||
chanhangup(srv->chan, "", 0);
|
|
||||||
memset(srv->buf, 0, sizeof(srv->buf));
|
|
||||||
chan = srv->chan;
|
chan = srv->chan;
|
||||||
|
fileinit(chan);
|
||||||
|
if(chatty)
|
||||||
|
print("%s closed\n", chan->whochan);
|
||||||
lock(&freechans);
|
lock(&freechans);
|
||||||
srv->chan = freechans.hd;
|
srv->chan = freechans.hd;
|
||||||
freechans.hd = chan;
|
freechans.hd = chan;
|
||||||
|
@ -81,14 +85,11 @@ srvo(void *)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
srv = (Srv*)mb->param;
|
srv = (Srv*)mb->param;
|
||||||
while((srv->fd >= 0) && (write(srv->fd, mb->data, mb->count) != mb->count)){
|
while(write(srv->fd, mb->data, mb->count) != mb->count){
|
||||||
rerrstr(buf, sizeof(buf));
|
rerrstr(buf, sizeof(buf));
|
||||||
if(strstr(buf, "interrupt"))
|
if(strstr(buf, "interrupt"))
|
||||||
continue;
|
continue;
|
||||||
|
chanhangup(srv->chan, buf);
|
||||||
if(buf[0] && chatty)
|
|
||||||
print("srvo %s: %s\n", srv->name, buf);
|
|
||||||
chanhangup(srv->chan, buf, 0);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mbfree(mb);
|
mbfree(mb);
|
||||||
|
@ -106,13 +107,13 @@ srvi(void *aux)
|
||||||
char buf[ERRMAX];
|
char buf[ERRMAX];
|
||||||
|
|
||||||
if((mb = mballoc(IOHDRSZ+Maxfdata, srv->chan, Mbeth1)) == nil)
|
if((mb = mballoc(IOHDRSZ+Maxfdata, srv->chan, Mbeth1)) == nil)
|
||||||
panic("srvi %s: mballoc failed", srv->name);
|
panic("srvi: mballoc failed");
|
||||||
b = mb->data;
|
b = mb->data;
|
||||||
p = b;
|
p = b;
|
||||||
e = b + mb->count;
|
e = b + mb->count;
|
||||||
|
|
||||||
Read:
|
Read:
|
||||||
while((srv->fd >= 0) && ((n = read(srv->fd, p, e - p)) >= 0)){
|
while((n = read(srv->fd, p, e - p)) >= 0){
|
||||||
p += n;
|
p += n;
|
||||||
while((p - b) >= BIT32SZ){
|
while((p - b) >= BIT32SZ){
|
||||||
m = GBIT32(b);
|
m = GBIT32(b);
|
||||||
|
@ -126,12 +127,12 @@ Read:
|
||||||
}
|
}
|
||||||
if(m <= SMALLBUF){
|
if(m <= SMALLBUF){
|
||||||
if((ms = mballoc(m, srv->chan, Mbeth1)) == nil)
|
if((ms = mballoc(m, srv->chan, Mbeth1)) == nil)
|
||||||
panic("srvi %s: mballoc failed", srv->name);
|
panic("srvi: mballoc failed");
|
||||||
memmove(ms->data, b, m);
|
memmove(ms->data, b, m);
|
||||||
} else {
|
} else {
|
||||||
ms = mb;
|
ms = mb;
|
||||||
if((mb = mballoc(mb->count, srv->chan, Mbeth1)) == nil)
|
if((mb = mballoc(mb->count, srv->chan, Mbeth1)) == nil)
|
||||||
panic("srvi %s: mballoc failed", srv->name);
|
panic("srvi: mballoc failed");
|
||||||
ms->count = m;
|
ms->count = m;
|
||||||
}
|
}
|
||||||
if(n > 0)
|
if(n > 0)
|
||||||
|
@ -151,9 +152,7 @@ Error:
|
||||||
if(strstr(buf, "interrupt"))
|
if(strstr(buf, "interrupt"))
|
||||||
goto Read;
|
goto Read;
|
||||||
|
|
||||||
if(buf[0] && chatty)
|
chanhangup(srv->chan, buf);
|
||||||
print("srvi %s: %s\n", srv->name, buf);
|
|
||||||
chanhangup(srv->chan, buf, 0);
|
|
||||||
srvput(srv);
|
srvput(srv);
|
||||||
|
|
||||||
mbfree(mb);
|
mbfree(mb);
|
||||||
|
@ -162,6 +161,7 @@ Error:
|
||||||
Chan*
|
Chan*
|
||||||
srvchan(int fd, char *name)
|
srvchan(int fd, char *name)
|
||||||
{
|
{
|
||||||
|
char buf[64];
|
||||||
Chan *chan;
|
Chan *chan;
|
||||||
Srv *srv;
|
Srv *srv;
|
||||||
|
|
||||||
|
@ -172,7 +172,7 @@ srvchan(int fd, char *name)
|
||||||
unlock(&freechans);
|
unlock(&freechans);
|
||||||
} else {
|
} else {
|
||||||
unlock(&freechans);
|
unlock(&freechans);
|
||||||
chan = fs_chaninit(Devsrv, 1, sizeof(*srv));
|
chan = fs_chaninit(1, sizeof(*srv));
|
||||||
srv = chan->pdata;
|
srv = chan->pdata;
|
||||||
}
|
}
|
||||||
chan->reply = srvoq;
|
chan->reply = srvoq;
|
||||||
|
@ -181,13 +181,13 @@ srvchan(int fd, char *name)
|
||||||
chan->protocol = nil;
|
chan->protocol = nil;
|
||||||
chan->msize = 0;
|
chan->msize = 0;
|
||||||
chan->whotime = 0;
|
chan->whotime = 0;
|
||||||
|
snprint(chan->whochan, sizeof(chan->whochan), "%s", name);
|
||||||
|
|
||||||
incref(srv);
|
incref(srv);
|
||||||
srv->chan = chan;
|
srv->chan = chan;
|
||||||
srv->fd = fd;
|
srv->fd = fd;
|
||||||
snprint(srv->buf, sizeof(srv->buf), "srvi %s", name);
|
snprint(buf, sizeof(buf), "srvi %s", name);
|
||||||
srv->name = strchr(srv->buf, ' ')+1;
|
newproc(srvi, srv, buf);
|
||||||
newproc(srvi, srv, srv->buf);
|
|
||||||
|
|
||||||
return chan;
|
return chan;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ dev2fs(Device *dev)
|
||||||
* of type 'type' and return pointer to base
|
* of type 'type' and return pointer to base
|
||||||
*/
|
*/
|
||||||
Chan*
|
Chan*
|
||||||
fs_chaninit(int type, int count, int data)
|
fs_chaninit(int count, int data)
|
||||||
{
|
{
|
||||||
uchar *p;
|
uchar *p;
|
||||||
Chan *cp, *icp;
|
Chan *cp, *icp;
|
||||||
|
@ -44,7 +44,6 @@ fs_chaninit(int type, int count, int data)
|
||||||
cp = (Chan*)p;
|
cp = (Chan*)p;
|
||||||
cp->next = chans;
|
cp->next = chans;
|
||||||
chans = cp;
|
chans = cp;
|
||||||
cp->type = type;
|
|
||||||
cp->chan = cons.chano;
|
cp->chan = cons.chano;
|
||||||
cons.chano++;
|
cons.chano++;
|
||||||
strncpy(cp->whoname, "<none>", sizeof cp->whoname);
|
strncpy(cp->whoname, "<none>", sizeof cp->whoname);
|
||||||
|
|
Loading…
Reference in a new issue