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: }