|
|
1.1 root 1: /*
2: * D U M P L D
3: *
4: * This line discipline is used for debugging.
5: * It passes on everything given to it, in the same order,
6: * but at the same time it creates a log of the message type
7: * and contents for each message.
8: *
9: *
10: * Written by Kurt Gollhardt (Nirvonics, Inc.)
11: * Last update Sat Mar 30 15:17:01 1985
12: *
13: */
14:
15: #include "../h/param.h"
16: #include "../h/systm.h"
17: #include "../h/stream.h"
18: #include "../h/ioctl.h"
19: #include "../h/ttyld.h"
20: #include "../h/conf.h"
21: #include "../h/dumpl.h"
22:
23: #include "dumpld.h"
24: #if NDUMPLD > 0
25:
26: int dumpput(), dumpopen(), dumpclose();
27:
28: static struct qinit rinit = { dumpput, NULL, dumpopen, dumpclose, 300, 0 },
29: winit = { dumpput, NULL, dumpopen, dumpclose, 300, 200 };
30: struct streamtab dumpinfo = { &rinit, &winit };
31:
32: #define DUMPSIZE 4096
33:
34: static char dumpbuf[NDUMPLD*2][DUMPSIZE];
35: struct dumpld dumpld[NDUMPLD*2];
36: struct dumpinf dumpinf[NDUMPLD*2];
37:
38: int ndumpbuf = NDUMPLD * 2;
39: int dumpver = 1;
40:
41:
42: dumpopen(q, dev)
43: struct queue *q;
44: dev_t dev;
45: {
46: register struct dumpld *di;
47: register struct dumpinf *dinf;
48:
49: if (q->ptr)
50: return 1;
51: for (di = dumpld; di < &dumpld[NDUMPLD*2]; di += 2)
52: if (di->base == (char *)0)
53: break;
54: if (di == &dumpld[NDUMPLD*2])
55: return 0;
56:
57: dinf = &dumpinf[di - dumpld];
58:
59: di->fillp = di->base = dumpbuf[di - dumpld];
60: di->size = DUMPSIZE;
61: q->ptr = (caddr_t)di;
62: ++di;
63: di->fillp = di->base = dumpbuf[di - dumpld];
64: di->size = DUMPSIZE;
65:
66: dinf->dev = dev;
67: (++dinf)->dev = dev;
68:
69: WR(q)->ptr = (caddr_t)di;
70: dumpupdate(q);
71: dumpupdate(WR(q));
72:
73: return 1;
74: }
75:
76:
77: dumpclose(q)
78: struct queue *q;
79: {
80: register struct dumpld *di = (struct dumpld *)q->ptr;
81:
82: dumpupdate(q);
83: dumpupdate(WR(q));
84:
85: di->base = (char *)0;
86: (di+1)->base = (char *)0;
87: q->ptr = (caddr_t)0;
88: }
89:
90:
91: dumpput(q, bp)
92: struct queue *q;
93: register struct block *bp;
94: {
95: register struct dumpld *di = (struct dumpld *)q->ptr;
96: register u_char *p;
97: struct dumpheader hd;
98: int ps = spl6();
99:
100: hd.type = bp->type;
101: hd.class = bp->class;
102: hd.count = bp->wptr - bp->rptr;
103: for (p = (u_char *)&hd; p < (u_char *)(&hd + 1);)
104: dumpchr(di, *p++);
105: for (p = bp->rptr; p < bp->wptr;)
106: dumpchr(di, *p++);
107:
108: (*q->next->qinfo->putp) (q->next, bp);
109: dumpupdate(q);
110:
111: splx(ps);
112: }
113:
114:
115: dumpchr(di, c)
116: register struct dumpld *di;
117: char c;
118: {
119: *(di->fillp)++ = c;
120: if (di->fillp >= di->base + di->size)
121: di->fillp = di->base;
122: }
123:
124:
125: dumpupdate(q)
126: register struct queue *q;
127: {
128: register struct queue *qnext = q->next;
129:
130: q->flag |= qnext->flag & (QFULL|QWANTR|QBIGB) | backq(q)->flag & QDELIM;
131: qnext->flag |= q->flag & QWANTW;
132: q->count = qnext->count;
133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.