|
|
1.1 ! root 1: /* dg2ps.c - datagram-backed abstraction for PStreams */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/dg2ps.c,v 7.0 89/11/23 22:12:34 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/dg2ps.c,v 7.0 89/11/23 22:12:34 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: dg2ps.c,v $ ! 12: * Revision 7.0 89/11/23 22:12:34 mrose ! 13: * Release 6.0 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * NOTICE ! 19: * ! 20: * Acquisition, use, and distribution of this module and related ! 21: * materials are subject to the restrictions of a license agreement. ! 22: * Consult the Preface in the User's Manual for the full terms of ! 23: * this agreement. ! 24: * ! 25: */ ! 26: ! 27: ! 28: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include "psap.h" ! 32: ! 33: ! 34: struct ps_dg { ! 35: int ps_fd; ! 36: int ps_maxsize; ! 37: ! 38: struct ps_inout { ! 39: struct qbuf *pio_qb; ! 40: char *pio_ptr; ! 41: int pio_cnt; ! 42: ! 43: IFP pio_fnx; ! 44: } ps_input, ! 45: ps_output; ! 46: }; ! 47: ! 48: /* */ ! 49: ! 50: static int dg_prime (ps, waiting) ! 51: register PS ps; ! 52: int waiting; ! 53: { ! 54: struct qbuf *qb; ! 55: register struct ps_dg *pt = (struct ps_dg *) ps -> ps_addr; ! 56: register struct ps_inout *pi = &pt -> ps_input; ! 57: ! 58: if (waiting) ! 59: return (pi -> pio_qb ? DONE : OK); ! 60: ! 61: if (pi -> pio_qb != NULL) { ! 62: qb_free (pi -> pio_qb); ! 63: pi -> pio_qb = NULL; ! 64: } ! 65: ! 66: if ((*pi -> pio_fnx) (pt -> ps_fd, &qb) == NOTOK) ! 67: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 68: ! 69: if (pi -> pio_qb = qb) ! 70: pi -> pio_ptr = qb -> qb_data, pi -> pio_cnt = qb -> qb_len; ! 71: else ! 72: pi -> pio_ptr = NULL, pi -> pio_cnt = 0; ! 73: ! 74: return OK; ! 75: } ! 76: ! 77: ! 78: /* ARGSUSED */ ! 79: ! 80: static int dg_read (ps, data, n, in_line) ! 81: register PS ps; ! 82: PElementData data; ! 83: PElementLen n; ! 84: int in_line; ! 85: { ! 86: int cc; ! 87: register struct ps_dg *pt = (struct ps_dg *) ps -> ps_addr; ! 88: register struct ps_inout *pi = &pt -> ps_input; ! 89: ! 90: if ((cc = pi -> pio_cnt) <= 0) ! 91: return 0; ! 92: if (cc > n) ! 93: cc = n; ! 94: ! 95: bcopy (pi -> pio_ptr, (char *) data, cc); ! 96: pi -> pio_ptr += cc, pi -> pio_cnt -= cc; ! 97: ! 98: return cc; ! 99: } ! 100: ! 101: ! 102: /* ARGSUSED */ ! 103: ! 104: static int dg_write (ps, data, n, in_line) ! 105: register PS ps; ! 106: PElementData data; ! 107: PElementLen n; ! 108: int in_line; ! 109: { ! 110: register struct ps_dg *pt = (struct ps_dg *) ps -> ps_addr; ! 111: register struct ps_inout *po = &pt -> ps_output; ! 112: ! 113: if (po -> pio_cnt < n) ! 114: return 0; ! 115: ! 116: bcopy ((char *) data, po -> pio_ptr, n); ! 117: po -> pio_ptr += n, po -> pio_cnt -= n; ! 118: ! 119: return n; ! 120: } ! 121: ! 122: ! 123: static int dg_flush (ps) ! 124: register PS ps; ! 125: { ! 126: register struct ps_dg *pt = (struct ps_dg *) ps -> ps_addr; ! 127: register struct ps_inout *po = &pt -> ps_output; ! 128: register struct qbuf *qb = po -> pio_qb; ! 129: ! 130: qb -> qb_len = po -> pio_ptr - qb -> qb_data; ! 131: if ((*po -> pio_fnx) (pt -> ps_fd, qb) != qb -> qb_len) ! 132: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 133: ! 134: po -> pio_ptr = qb -> qb_data, po -> pio_cnt = pt -> ps_maxsize; ! 135: ! 136: return OK; ! 137: } ! 138: ! 139: ! 140: static int dg_close (ps) ! 141: register PS ps; ! 142: { ! 143: register struct ps_dg *pt = (struct ps_dg *) ps -> ps_addr; ! 144: ! 145: if (pt == NULL) ! 146: return OK; ! 147: ! 148: if (pt -> ps_input.pio_qb) ! 149: qb_free (pt -> ps_input.pio_qb); ! 150: if (pt -> ps_output.pio_qb) ! 151: qb_free (pt -> ps_output.pio_qb); ! 152: ! 153: free ((char *) pt); ! 154: ! 155: return OK; ! 156: } ! 157: ! 158: /* */ ! 159: ! 160: int dg_open (ps) ! 161: register PS ps; ! 162: { ! 163: ps -> ps_primeP = dg_prime; ! 164: ps -> ps_readP = dg_read; ! 165: ps -> ps_writeP = dg_write; ! 166: ps -> ps_flushP = dg_flush; ! 167: ps -> ps_closeP = dg_close; ! 168: ! 169: return OK; ! 170: } ! 171: ! 172: ! 173: int dg_setup (ps, fd, size, rfx, wfx) ! 174: register PS ps; ! 175: int fd, ! 176: size; ! 177: IFP rfx, ! 178: wfx; ! 179: { ! 180: register struct ps_dg *pt; ! 181: register struct ps_inout *po; ! 182: register struct qbuf *qb; ! 183: ! 184: if ((pt = (struct ps_dg *) calloc (1, sizeof *pt)) == NULL) ! 185: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 186: ps -> ps_addr = (caddr_t) pt; ! 187: ! 188: pt -> ps_fd = fd; ! 189: pt -> ps_maxsize = size; ! 190: ! 191: if ((qb = (struct qbuf *) malloc (sizeof *qb ! 192: + (unsigned) pt -> ps_maxsize)) ! 193: == NULL) ! 194: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 195: qb -> qb_forw = qb -> qb_back = qb; ! 196: qb -> qb_len = 0; ! 197: qb -> qb_data = qb -> qb_base; ! 198: ! 199: po = &pt -> ps_output; ! 200: po -> pio_qb = qb; ! 201: po -> pio_ptr = qb -> qb_data, po -> pio_cnt = pt -> ps_maxsize; ! 202: if ((pt -> ps_input.pio_fnx = rfx) == NULLIFP ! 203: || (po -> pio_fnx = wfx) == NULLIFP) ! 204: return ps_seterr (ps, PS_ERR_XXX, NOTOK); ! 205: ! 206: return OK; ! 207: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.