summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-07-12 21:00:12 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-07-12 21:00:12 +0200
commit53f5bdfd06cce8093de005b8d706b752d3567cfa (patch)
treeb4cf65096642c5e88dc002fa3d1af9c4f37b5465
parent55959acbdf97f3cb82a10370dd165cc061b2155c (diff)
downloadplan9front-53f5bdfd06cce8093de005b8d706b752d3567cfa.tar.xz
cwfs: set whochan for who command, cleanup
-rw-r--r--sys/src/cmd/cwfs/con.c7
-rw-r--r--sys/src/cmd/cwfs/config.c2
-rw-r--r--sys/src/cmd/cwfs/portdat.h3
-rw-r--r--sys/src/cmd/cwfs/portfns.h4
-rw-r--r--sys/src/cmd/cwfs/srv.c72
-rw-r--r--sys/src/cmd/cwfs/sub.c3
6 files changed, 42 insertions, 49 deletions
diff --git a/sys/src/cmd/cwfs/con.c b/sys/src/cmd/cwfs/con.c
index 41fe43142..11fcadf8d 100644
--- a/sys/src/cmd/cwfs/con.c
+++ b/sys/src/cmd/cwfs/con.c
@@ -342,11 +342,8 @@ cmd_hangup(int argc, char *argv[])
print("that chan is hung up\n");
continue;
}
- if(cp->chan == n) {
- /* need more than just fileinit with tcp */
- chanhangup(cp, "console command", 1);
- fileinit(cp);
- }
+ if(cp->chan == n)
+ chanhangup(cp, "console command");
}
}
diff --git a/sys/src/cmd/cwfs/config.c b/sys/src/cmd/cwfs/config.c
index 13e4748cb..d371a8bed 100644
--- a/sys/src/cmd/cwfs/config.c
+++ b/sys/src/cmd/cwfs/config.c
@@ -539,7 +539,7 @@ sysinit(void)
Fspar *fsp;
Iobuf *p;
- cons.chan = fs_chaninit(Devcon, 1, 0);
+ cons.chan = fs_chaninit(1, 0);
start:
/*
diff --git a/sys/src/cmd/cwfs/portdat.h b/sys/src/cmd/cwfs/portdat.h
index ffa510230..fba14dbbe 100644
--- a/sys/src/cmd/cwfs/portdat.h
+++ b/sys/src/cmd/cwfs/portdat.h
@@ -246,7 +246,6 @@ struct Hiob
/* a 9P connection */
struct Chan
{
- char type; /* major driver type i.e. Dev* */
int (*protocol)(Msgbuf*); /* version */
int msize; /* version */
char whochan[50];
@@ -683,7 +682,6 @@ enum
enum
{
Devnone = 0,
- Devcon, /* console */
Devwren, /* disk drive */
Devworm, /* scsi optical drive */
Devlworm, /* scsi optical drive (labeled) */
@@ -698,7 +696,6 @@ enum
Devfloppy, /* floppy drive */
Devswab, /* swab data between mem and device */
Devmirr, /* mirror devices */
- Devsrv, /* pipes and network connections */
MAXDEV
};
diff --git a/sys/src/cmd/cwfs/portfns.h b/sys/src/cmd/cwfs/portfns.h
index a0217abb3..55706958d 100644
--- a/sys/src/cmd/cwfs/portfns.h
+++ b/sys/src/cmd/cwfs/portfns.h
@@ -15,8 +15,8 @@ int byuid(void*, void*);
int canlock(Lock*);
int canqlock(QLock*);
void cfsdump(Filsys*);
-void chanhangup(Chan *cp, char *msg, int dolock);
-Chan* fs_chaninit(int, int, int);
+void chanhangup(Chan *cp, char *msg);
+Chan* fs_chaninit(int, int);
void cmd_check(int, char*[]);
void cmd_users(int, char*[]);
void cmd_newuser(int, char*[]);
diff --git a/sys/src/cmd/cwfs/srv.c b/sys/src/cmd/cwfs/srv.c
index 52d32ffa5..69f314383 100644
--- a/sys/src/cmd/cwfs/srv.c
+++ b/sys/src/cmd/cwfs/srv.c
@@ -5,43 +5,47 @@
enum {
Maxfdata = 8192,
- Nqueue = 200, /* queue size (tunable) */
- Nsrvo = 8, /* number of write workers */
+ Nqueue = 200, /* queue size (tunable) */
+ Nsrvo = 8, /* number of write workers */
};
typedef struct Srv Srv;
struct Srv
{
Ref;
- char *name;
Chan *chan;
- int fd;
- char buf[64];
+ int fd;
};
static struct {
Lock;
- Chan *hd;
+ Chan *hd;
} freechans;
static Queue *srvoq;
void
-chanhangup(Chan *chan, char *msg, int dolock)
+chanhangup(Chan *chan, char *msg)
{
+ char buf[128], *p;
Srv *srv;
-
- USED(dolock);
- USED(msg);
+ int cfd;
fileinit(chan);
- if(chan->type != Devsrv)
- return;
srv = chan->pdata;
- if(srv == nil || srv->chan != chan)
+ if(chan == cons.chan || srv == nil || srv->chan != chan)
return;
- close(srv->fd);
- srv->fd = -1;
+ if(msg[0] && chatty)
+ 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
@@ -52,12 +56,12 @@ srvput(Srv *srv)
if(decref(srv))
return;
- if(chatty)
- print("%s closed\n", srv->name);
-
- chanhangup(srv->chan, "", 0);
- memset(srv->buf, 0, sizeof(srv->buf));
+ close(srv->fd);
+ srv->fd = -1;
chan = srv->chan;
+ fileinit(chan);
+ if(chatty)
+ print("%s closed\n", chan->whochan);
lock(&freechans);
srv->chan = freechans.hd;
freechans.hd = chan;
@@ -81,14 +85,11 @@ srvo(void *)
continue;
}
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));
if(strstr(buf, "interrupt"))
continue;
-
- if(buf[0] && chatty)
- print("srvo %s: %s\n", srv->name, buf);
- chanhangup(srv->chan, buf, 0);
+ chanhangup(srv->chan, buf);
break;
}
mbfree(mb);
@@ -106,13 +107,13 @@ srvi(void *aux)
char buf[ERRMAX];
if((mb = mballoc(IOHDRSZ+Maxfdata, srv->chan, Mbeth1)) == nil)
- panic("srvi %s: mballoc failed", srv->name);
+ panic("srvi: mballoc failed");
b = mb->data;
p = b;
e = b + mb->count;
Read:
- while((srv->fd >= 0) && ((n = read(srv->fd, p, e - p)) >= 0)){
+ while((n = read(srv->fd, p, e - p)) >= 0){
p += n;
while((p - b) >= BIT32SZ){
m = GBIT32(b);
@@ -126,12 +127,12 @@ Read:
}
if(m <= SMALLBUF){
if((ms = mballoc(m, srv->chan, Mbeth1)) == nil)
- panic("srvi %s: mballoc failed", srv->name);
+ panic("srvi: mballoc failed");
memmove(ms->data, b, m);
} else {
ms = mb;
if((mb = mballoc(mb->count, srv->chan, Mbeth1)) == nil)
- panic("srvi %s: mballoc failed", srv->name);
+ panic("srvi: mballoc failed");
ms->count = m;
}
if(n > 0)
@@ -151,9 +152,7 @@ Error:
if(strstr(buf, "interrupt"))
goto Read;
- if(buf[0] && chatty)
- print("srvi %s: %s\n", srv->name, buf);
- chanhangup(srv->chan, buf, 0);
+ chanhangup(srv->chan, buf);
srvput(srv);
mbfree(mb);
@@ -162,6 +161,7 @@ Error:
Chan*
srvchan(int fd, char *name)
{
+ char buf[64];
Chan *chan;
Srv *srv;
@@ -172,7 +172,7 @@ srvchan(int fd, char *name)
unlock(&freechans);
} else {
unlock(&freechans);
- chan = fs_chaninit(Devsrv, 1, sizeof(*srv));
+ chan = fs_chaninit(1, sizeof(*srv));
srv = chan->pdata;
}
chan->reply = srvoq;
@@ -181,13 +181,13 @@ srvchan(int fd, char *name)
chan->protocol = nil;
chan->msize = 0;
chan->whotime = 0;
+ snprint(chan->whochan, sizeof(chan->whochan), "%s", name);
incref(srv);
srv->chan = chan;
srv->fd = fd;
- snprint(srv->buf, sizeof(srv->buf), "srvi %s", name);
- srv->name = strchr(srv->buf, ' ')+1;
- newproc(srvi, srv, srv->buf);
+ snprint(buf, sizeof(buf), "srvi %s", name);
+ newproc(srvi, srv, buf);
return chan;
}
diff --git a/sys/src/cmd/cwfs/sub.c b/sys/src/cmd/cwfs/sub.c
index ebc49eafa..d5c53b35e 100644
--- a/sys/src/cmd/cwfs/sub.c
+++ b/sys/src/cmd/cwfs/sub.c
@@ -32,7 +32,7 @@ dev2fs(Device *dev)
* of type 'type' and return pointer to base
*/
Chan*
-fs_chaninit(int type, int count, int data)
+fs_chaninit(int count, int data)
{
uchar *p;
Chan *cp, *icp;
@@ -44,7 +44,6 @@ fs_chaninit(int type, int count, int data)
cp = (Chan*)p;
cp->next = chans;
chans = cp;
- cp->type = type;
cp->chan = cons.chano;
cons.chano++;
strncpy(cp->whoname, "<none>", sizeof cp->whoname);