|
|
1.1 root 1: # include "ctlmod.h"
2: # include "pipes.h"
3: # include <sccs.h>
4:
5: SCCSID(@(#)pb_read.c 8.1 12/31/84)
6:
7: /*
8: ** PB_READ -- read a pipe block
9: **
10: ** This routine reads a pipe block into *ppb. It also handles
11: ** all the low level protocol: RESET blocks, SYNC blocks, META
12: ** blocks, blocks intended for another process, etc.
13: **
14: ** When this routine returns, it returns with a block intended
15: ** for this process, which must be a REGULAR block, a RESPONSE
16: ** block, or an ERROR block.
17: **
18: ** Parameters:
19: ** ppb -- a pointer to the area which wants the block.
20: **
21: ** Returns:
22: ** none
23: **
24: ** Side Effects:
25: ** ppb is set to the named block.
26: ** Virtually any amount of stuff can happen, depending
27: ** on what is coming through the pipe.
28: **
29: ** Trace Flags:
30: ** 12.4 - 12.9
31: */
32:
33:
34: pb_read(ppb)
35: register pb_t *ppb;
36: {
37: register int type;
38: register int from;
39: extern int (*ExitFn)();
40:
41: /*
42: ** Top Loop.
43: ** Hang waiting for a normal block. Other blocks are
44: ** handled inside the loop.
45: ** We multiplex 'from' in here temporarily.
46: */
47:
48: for (;;)
49: {
50: # ifdef xCTR1
51: if (tTf(12, 4))
52: lprintf("pb_read: fd=%d:\n", Cm.cm_input);
53: # endif
54: from = pb_rphys(ppb, Cm.cm_input);
55: if (from == 0)
56: {
57: # ifdef xCTR1
58: if (tTf(12, 4))
59: lprintf("EOF\n");
60: # endif
61: (*ExitFn)(0);
62: }
63: else if (from != PB_IOSIZE)
64: syserr("pb_read: read error (%d)", from);
65: # ifdef xCTR1
66: if (tTf(12, 4))
67: pb_dump(ppb, TRUE);
68: # endif
69:
70: /* set up buffer pointers, etc. */
71: ppb->pb_xptr = ppb->pb_data;
72: ppb->pb_nleft = ppb->pb_nused;
73: type = ppb->pb_type;
74: from = ppb->pb_from;
75: # ifdef xCM_DEBUG
76: if (from > CM_MAXPROC || from < 0)
77: syserr("pb_read: from %d", from);
78: # endif
79:
80: /* mark this block if possibly from the front */
81: if (Cm.cm_input == Cm.cm_proc[0].pr_ninput &&
82: bitset(PR_RADJCT, Cm.cm_proc[0].pr_stat))
83: setbit(PB_FRFR, ppb->pb_stat);
84:
85: /* handle RESET blocks before anything else */
86: if (type == PB_RESET)
87: {
88: cm_reset();
89: continue;
90: }
91:
92: /* do sync block processing */
93: if (type == PB_SYNC)
94: {
95: /*
96: if (Syncs[from] <= 0)
97: lprintf("pb_read: bad SYNC block from %d", from);
98: else
99: */
100: Syncs[from]--;
101: continue;
102: }
103:
104: /* see if we are ignoring from this process */
105: if (Syncs[from] > 0)
106: continue;
107:
108: /* check for re-routing */
109: if (ppb->pb_proc != Cm.cm_myproc)
110: {
111: pb_write(ppb);
112: if (ppb->pb_proc != PB_WILD)
113: continue;
114: }
115:
116: /*
117: ** Block type dispatching.
118: ** Regular, response, and error blocks return.
119: ** Meta blocks are handled by calling other
120: ** routines.
121: */
122:
123: switch (type)
124: {
125: case PB_REG:
126: case PB_RESP:
127: case PB_ERR:
128: /* handled by readinput() */
129: return;
130:
131: case PB_TRACE:
132: pb_trace(ppb);
133: break;
134:
135: /* insert more meta handling before this line */
136:
137: default:
138: syserr("pb_read: type %d", type);
139: }
140: }
141: }
142: /*
143: ** PB_TRACE -- handle dynamic trace information
144: **
145: ** Parameters:
146: ** ppb -- a pipe block from which to get information.
147: **
148: ** Returns:
149: ** none.
150: **
151: ** Side Effects:
152: ** trace vectors will be changed.
153: */
154:
155: pb_trace(ppb)
156: pb_t *ppb;
157: {
158: register int i;
159: register struct fn_def *f;
160:
161: for (i = 0; i < NumFunc; i++)
162: {
163: f = FuncVect[i];
164: if (f->fn_tflag != '\0')
165: tTamper(ppb->pb_data, f->fn_tflag, f->fn_tvect, f->fn_tsize);
166: }
167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.