cwfs: set whochan for who command, cleanup

This commit is contained in:
cinap_lenrek 2012-07-12 21:00:12 +02:00
parent 55959acbdf
commit 53f5bdfd06
6 changed files with 42 additions and 49 deletions

View file

@ -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);
}
} }
} }

View file

@ -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:
/* /*

View file

@ -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
}; };

View file

@ -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*[]);

View file

@ -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;
} }

View file

@ -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);