diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-11-23 01:05:33 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2013-11-23 01:05:33 +0100 |
commit | 2f9ae0f8ac8610e13ced184847b57b87fe5db580 (patch) | |
tree | f9ad2223d518585a2cfe9ea1c73e1e37d07bf637 /sys/src/cmd/unix/drawterm/kern/devpipe.c | |
parent | ea5797c0731203c09ec5fb7172e77eab2750f1a9 (diff) |
removing (outdated) drawterm
drawterm is much better maintained by russ cox,
so removing this outdated copy.
for a more recent version, go to:
http://swtch.com/drawterm/
Diffstat (limited to 'sys/src/cmd/unix/drawterm/kern/devpipe.c')
-rw-r--r-- | sys/src/cmd/unix/drawterm/kern/devpipe.c | 398 |
1 files changed, 0 insertions, 398 deletions
diff --git a/sys/src/cmd/unix/drawterm/kern/devpipe.c b/sys/src/cmd/unix/drawterm/kern/devpipe.c deleted file mode 100644 index 73401f99f..000000000 --- a/sys/src/cmd/unix/drawterm/kern/devpipe.c +++ /dev/null @@ -1,398 +0,0 @@ -#include "u.h" -#include "lib.h" -#include "dat.h" -#include "fns.h" -#include "error.h" - -#include "netif.h" - -typedef struct Pipe Pipe; -struct Pipe -{ - QLock lk; - Pipe *next; - int ref; - ulong path; - Queue *q[2]; - int qref[2]; -}; - -struct -{ - Lock lk; - ulong path; -} pipealloc; - -enum -{ - Qdir, - Qdata0, - Qdata1, -}; - -Dirtab pipedir[] = -{ - ".", {Qdir,0,QTDIR}, 0, DMDIR|0500, - "data", {Qdata0}, 0, 0600, - "data1", {Qdata1}, 0, 0600, -}; -#define NPIPEDIR 3 - -static void -pipeinit(void) -{ - if(conf.pipeqsize == 0){ - if(conf.nmach > 1) - conf.pipeqsize = 256*1024; - else - conf.pipeqsize = 32*1024; - } -} - -/* - * create a pipe, no streams are created until an open - */ -static Chan* -pipeattach(char *spec) -{ - Pipe *p; - Chan *c; - - c = devattach('|', spec); - p = malloc(sizeof(Pipe)); - if(p == 0) - exhausted("memory"); - p->ref = 1; - - p->q[0] = qopen(conf.pipeqsize, 0, 0, 0); - if(p->q[0] == 0){ - free(p); - exhausted("memory"); - } - p->q[1] = qopen(conf.pipeqsize, 0, 0, 0); - if(p->q[1] == 0){ - free(p->q[0]); - free(p); - exhausted("memory"); - } - - lock(&pipealloc.lk); - p->path = ++pipealloc.path; - unlock(&pipealloc.lk); - - mkqid(&c->qid, NETQID(2*p->path, Qdir), 0, QTDIR); - c->aux = p; - c->dev = 0; - return c; -} - -static int -pipegen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp) -{ - Qid q; - int len; - Pipe *p; - - USED(name); - - if(i == DEVDOTDOT){ - devdir(c, c->qid, "#|", 0, eve, DMDIR|0555, dp); - return 1; - } - i++; /* skip . */ - if(tab==0 || i>=ntab) - return -1; - - tab += i; - p = c->aux; - switch((ulong)tab->qid.path){ - case Qdata0: - len = qlen(p->q[0]); - break; - case Qdata1: - len = qlen(p->q[1]); - break; - default: - len = tab->length; - break; - } - mkqid(&q, NETQID(NETID(c->qid.path), tab->qid.path), 0, QTFILE); - devdir(c, q, tab->name, len, eve, tab->perm, dp); - return 1; -} - - -static Walkqid* -pipewalk(Chan *c, Chan *nc, char **name, int nname) -{ - Walkqid *wq; - Pipe *p; - - wq = devwalk(c, nc, name, nname, pipedir, NPIPEDIR, pipegen); - if(wq != nil && wq->clone != nil && wq->clone != c){ - p = c->aux; - qlock(&p->lk); - p->ref++; - if(c->flag & COPEN){ - print("channel open in pipewalk\n"); - switch(NETTYPE(c->qid.path)){ - case Qdata0: - p->qref[0]++; - break; - case Qdata1: - p->qref[1]++; - break; - } - } - qunlock(&p->lk); - } - return wq; -} - -static int -pipestat(Chan *c, uchar *db, int n) -{ - Pipe *p; - Dir dir; - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdir: - devdir(c, c->qid, ".", 0, eve, DMDIR|0555, &dir); - break; - case Qdata0: - devdir(c, c->qid, "data", qlen(p->q[0]), eve, 0600, &dir); - break; - case Qdata1: - devdir(c, c->qid, "data1", qlen(p->q[1]), eve, 0600, &dir); - break; - default: - panic("pipestat"); - } - n = convD2M(&dir, db, n); - if(n < BIT16SZ) - error(Eshortstat); - return n; -} - -/* - * if the stream doesn't exist, create it - */ -static Chan* -pipeopen(Chan *c, int omode) -{ - Pipe *p; - - if(c->qid.type & QTDIR){ - if(omode != OREAD) - error(Ebadarg); - c->mode = omode; - c->flag |= COPEN; - c->offset = 0; - return c; - } - - p = c->aux; - qlock(&p->lk); - switch(NETTYPE(c->qid.path)){ - case Qdata0: - p->qref[0]++; - break; - case Qdata1: - p->qref[1]++; - break; - } - qunlock(&p->lk); - - c->mode = openmode(omode); - c->flag |= COPEN; - c->offset = 0; - c->iounit = qiomaxatomic; - return c; -} - -static void -pipeclose(Chan *c) -{ - Pipe *p; - - p = c->aux; - qlock(&p->lk); - - if(c->flag & COPEN){ - /* - * closing either side hangs up the stream - */ - switch(NETTYPE(c->qid.path)){ - case Qdata0: - p->qref[0]--; - if(p->qref[0] == 0){ - qhangup(p->q[1], 0); - qclose(p->q[0]); - } - break; - case Qdata1: - p->qref[1]--; - if(p->qref[1] == 0){ - qhangup(p->q[0], 0); - qclose(p->q[1]); - } - break; - } - } - - - /* - * if both sides are closed, they are reusable - */ - if(p->qref[0] == 0 && p->qref[1] == 0){ - qreopen(p->q[0]); - qreopen(p->q[1]); - } - - /* - * free the structure on last close - */ - p->ref--; - if(p->ref == 0){ - qunlock(&p->lk); - free(p->q[0]); - free(p->q[1]); - free(p); - } else - qunlock(&p->lk); -} - -static long -piperead(Chan *c, void *va, long n, vlong offset) -{ - Pipe *p; - - USED(offset); - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdir: - return devdirread(c, va, n, pipedir, NPIPEDIR, pipegen); - case Qdata0: - return qread(p->q[0], va, n); - case Qdata1: - return qread(p->q[1], va, n); - default: - panic("piperead"); - } - return -1; /* not reached */ -} - -static Block* -pipebread(Chan *c, long n, ulong offset) -{ - Pipe *p; - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdata0: - return qbread(p->q[0], n); - case Qdata1: - return qbread(p->q[1], n); - } - - return devbread(c, n, offset); -} - -/* - * a write to a closed pipe causes a note to be sent to - * the process. - */ -static long -pipewrite(Chan *c, void *va, long n, vlong offset) -{ - Pipe *p; - - USED(offset); - if(!islo()) - print("pipewrite hi %lux\n", getcallerpc(&c)); - - if(waserror()) { - /* avoid notes when pipe is a mounted queue */ - if((c->flag & CMSG) == 0) - postnote(up, 1, "sys: write on closed pipe", NUser); - nexterror(); - } - - p = c->aux; - - switch(NETTYPE(c->qid.path)){ - case Qdata0: - n = qwrite(p->q[1], va, n); - break; - - case Qdata1: - n = qwrite(p->q[0], va, n); - break; - - default: - panic("pipewrite"); - } - - poperror(); - return n; -} - -static long -pipebwrite(Chan *c, Block *bp, ulong offset) -{ - long n; - Pipe *p; - - USED(offset); - - if(waserror()) { - /* avoid notes when pipe is a mounted queue */ - if((c->flag & CMSG) == 0) - postnote(up, 1, "sys: write on closed pipe", NUser); - nexterror(); - } - - p = c->aux; - switch(NETTYPE(c->qid.path)){ - case Qdata0: - n = qbwrite(p->q[1], bp); - break; - - case Qdata1: - n = qbwrite(p->q[0], bp); - break; - - default: - n = 0; - panic("pipebwrite"); - } - - poperror(); - return n; -} - -Dev pipedevtab = { - '|', - "pipe", - - devreset, - pipeinit, - devshutdown, - pipeattach, - pipewalk, - pipestat, - pipeopen, - devcreate, - pipeclose, - piperead, - pipebread, - pipewrite, - pipebwrite, - devremove, - devwstat, -}; |