V9/sys/dev.old/dumpld.c

Compare this file to the similar file:
Show the results in this format:

/*
 *             D U M P  L D
 *
 * This line discipline is used for debugging.
 * It passes on everything given to it, in the same order,
 * but at the same time it creates a log of the message type
 * and contents for each message.
 *
 *
 * Written by Kurt Gollhardt  (Nirvonics, Inc.)
 * Last update Sat Mar 30 15:17:01 1985
 *
 */

#include "../h/param.h"
#include "../h/systm.h"
#include "../h/stream.h"
#include "../h/ioctl.h"
#include "../h/ttyld.h"
#include "../h/conf.h"
#include "../h/dumpl.h"

#include "dumpld.h"
#if NDUMPLD > 0

int  dumpput(), dumpopen(), dumpclose();

static struct qinit rinit = { dumpput, NULL, dumpopen, dumpclose, 300, 0 },
                    winit = { dumpput, NULL, dumpopen, dumpclose, 300, 200 };
struct streamtab dumpinfo = { &rinit, &winit };

#define DUMPSIZE    4096

static char    dumpbuf[NDUMPLD*2][DUMPSIZE];
struct dumpld  dumpld[NDUMPLD*2];
struct dumpinf dumpinf[NDUMPLD*2];

int ndumpbuf = NDUMPLD * 2;
int dumpver = 1;


dumpopen(q, dev)
     struct queue   *q;
     dev_t          dev;
{
     register struct dumpld *di;
     register struct dumpinf *dinf;

     if (q->ptr)
          return 1;
     for (di = dumpld; di < &dumpld[NDUMPLD*2]; di += 2)
          if (di->base == (char *)0)
	       break;
     if (di == &dumpld[NDUMPLD*2])
          return 0;

     dinf = &dumpinf[di - dumpld];

     di->fillp = di->base = dumpbuf[di - dumpld];
     di->size = DUMPSIZE;
     q->ptr = (caddr_t)di;
     ++di;
     di->fillp = di->base = dumpbuf[di - dumpld];
     di->size = DUMPSIZE;

     dinf->dev = dev;
     (++dinf)->dev = dev;

     WR(q)->ptr = (caddr_t)di;
     dumpupdate(q);
     dumpupdate(WR(q));

     return 1;
}


dumpclose(q)
     struct queue   *q;
{
     register struct dumpld *di = (struct dumpld *)q->ptr;

     dumpupdate(q);
     dumpupdate(WR(q));

     di->base = (char *)0;
     (di+1)->base = (char *)0;
     q->ptr = (caddr_t)0;
}


dumpput(q, bp)
     struct queue   *q;
     register struct block    *bp;
{
     register struct dumpld *di = (struct dumpld *)q->ptr;
     register u_char     *p;
     struct dumpheader	 hd;
     int  ps = spl6();

     hd.type = bp->type;
     hd.class = bp->class;
     hd.count = bp->wptr - bp->rptr;
     for (p = (u_char *)&hd; p < (u_char *)(&hd + 1);)
	  dumpchr(di, *p++);
     for (p = bp->rptr; p < bp->wptr;)
	  dumpchr(di, *p++);

     (*q->next->qinfo->putp) (q->next, bp);
     dumpupdate(q);

     splx(ps);
}


dumpchr(di, c)
     register struct dumpld *di;
     char c;
{
     *(di->fillp)++ = c;
     if (di->fillp >= di->base + di->size)
          di->fillp = di->base;
}


dumpupdate(q)
     register struct queue    *q;
{
     register struct queue    *qnext = q->next;

     q->flag |= qnext->flag & (QFULL|QWANTR|QBIGB) | backq(q)->flag & QDELIM;
     qnext->flag |= q->flag & QWANTW;
     q->count = qnext->count;
}