|
|
1.1 ! root 1: /* fdx2ps.c - full-duplex abstraction for PStreams */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/fdx2ps.c,v 7.0 89/11/23 22:12:35 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/fdx2ps.c,v 7.0 89/11/23 22:12:35 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: fdx2ps.c,v $ ! 12: * Revision 7.0 89/11/23 22:12:35 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: /* DATA */ ! 34: ! 35: struct ps_fdx { ! 36: int ps_fd; ! 37: ! 38: struct ps_inout { ! 39: char *pio_base; ! 40: int pio_bufsiz; ! 41: ! 42: char *pio_ptr; ! 43: int pio_cnt; ! 44: } ps_input, ! 45: ps_output; ! 46: }; ! 47: ! 48: /* */ ! 49: ! 50: static int fdx_prime (ps, waiting) ! 51: register PS ps; ! 52: int waiting; ! 53: { ! 54: register struct ps_fdx *pt = (struct ps_fdx *) ps -> ps_addr; ! 55: register struct ps_inout *pi = &pt -> ps_input; ! 56: ! 57: return (waiting && pi -> pio_cnt > 0 ? DONE : OK); ! 58: } ! 59: ! 60: /* */ ! 61: ! 62: /* ARGSUSED */ ! 63: ! 64: static int fdx_read (ps, data, n, in_line) ! 65: register PS ps; ! 66: PElementData data; ! 67: PElementLen n; ! 68: int in_line; ! 69: { ! 70: int cc; ! 71: register struct ps_fdx *pt = (struct ps_fdx *) ps -> ps_addr; ! 72: register struct ps_inout *pi = &pt -> ps_input; ! 73: ! 74: if ((cc = pi -> pio_cnt) <= 0) { ! 75: if (n > pi -> pio_bufsiz) { ! 76: if ((cc = read (pt -> ps_fd, (char *) data, n)) == NOTOK) ! 77: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 78: ! 79: return cc; ! 80: } ! 81: ! 82: if ((cc = read (pt -> ps_fd, pi -> pio_base, pi -> pio_bufsiz)) ! 83: == NOTOK) ! 84: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 85: pi -> pio_ptr = pi -> pio_base, pi -> pio_cnt = cc; ! 86: } ! 87: ! 88: if (cc > n) ! 89: cc = n; ! 90: ! 91: bcopy (pi -> pio_ptr, (char *) data, cc); ! 92: pi -> pio_ptr += cc, pi -> pio_cnt -= cc; ! 93: ! 94: return cc; ! 95: } ! 96: ! 97: ! 98: /* ARGSUSED */ ! 99: ! 100: static int fdx_write (ps, data, n, in_line) ! 101: register PS ps; ! 102: PElementData data; ! 103: PElementLen n; ! 104: int in_line; ! 105: { ! 106: int cc; ! 107: register struct ps_fdx *pt = (struct ps_fdx *) ps -> ps_addr; ! 108: register struct ps_inout *po = &pt -> ps_output; ! 109: ! 110: #ifdef oldef ! 111: if (n > po -> pio_bufsiz) { ! 112: if (fdx_flush (ps) == NOTOK ! 113: || (cc = write (pt -> ps_fd, (char *) data, n)) != n) ! 114: #else ! 115: if (n > po -> pio_bufsiz && po -> pio_ptr <= po -> pio_base) { ! 116: if ((cc = write (pt -> ps_fd, (char *) data, n)) != n) ! 117: #endif ! 118: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 119: ! 120: return cc; ! 121: } ! 122: ! 123: if (n > po -> pio_cnt) ! 124: n = po -> pio_cnt; ! 125: ! 126: bcopy ((char *) data, po -> pio_ptr, n); ! 127: po -> pio_ptr += n, po -> pio_cnt -= n; ! 128: ! 129: if (po -> pio_cnt <= 0 && fdx_flush (ps) == NOTOK) ! 130: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 131: ! 132: return n; ! 133: } ! 134: ! 135: ! 136: static int fdx_flush (ps) ! 137: register PS ps; ! 138: { ! 139: int cc; ! 140: register struct ps_fdx *pt = (struct ps_fdx *) ps -> ps_addr; ! 141: register struct ps_inout *po = &pt -> ps_output; ! 142: ! 143: if ((cc = po -> pio_ptr - po -> pio_base) <= 0) ! 144: return OK; ! 145: ! 146: if (write (pt -> ps_fd, po -> pio_base, cc) != cc) ! 147: return ps_seterr (ps, PS_ERR_IO, NOTOK); ! 148: po -> pio_ptr = po -> pio_base, po -> pio_cnt = po -> pio_bufsiz; ! 149: ! 150: return OK; ! 151: } ! 152: ! 153: ! 154: static int fdx_close (ps) ! 155: register PS ps; ! 156: { ! 157: register struct ps_fdx *pt = (struct ps_fdx *) ps -> ps_addr; ! 158: ! 159: if (pt == NULL) ! 160: return OK; ! 161: ! 162: if (pt -> ps_input.pio_base) ! 163: free (pt -> ps_input.pio_base); ! 164: if (pt -> ps_output.pio_base) ! 165: free (pt -> ps_output.pio_base); ! 166: ! 167: free ((char *) pt); ! 168: ! 169: return OK; ! 170: } ! 171: ! 172: /* */ ! 173: ! 174: int fdx_open (ps) ! 175: register PS ps; ! 176: { ! 177: ps -> ps_primeP = fdx_prime; ! 178: ps -> ps_readP = fdx_read; ! 179: ps -> ps_writeP = fdx_write; ! 180: ps -> ps_flushP = fdx_flush; ! 181: ps -> ps_closeP = fdx_close; ! 182: ! 183: return OK; ! 184: } ! 185: ! 186: ! 187: int fdx_setup (ps, fd) ! 188: register PS ps; ! 189: int fd; ! 190: { ! 191: int pz; ! 192: register struct ps_fdx *pt; ! 193: ! 194: if ((pt = (struct ps_fdx *) calloc (1, sizeof *pt)) == NULL) ! 195: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 196: ps -> ps_addr = (caddr_t) pt; ! 197: ! 198: pt -> ps_fd = fd; ! 199: ! 200: #ifdef BSD42 ! 201: if ((pz = getpagesize ()) <= 0) ! 202: #endif ! 203: pz = BUFSIZ; ! 204: ! 205: if ((pt -> ps_input.pio_base = malloc ((unsigned) pz)) == NULL ! 206: || (pt -> ps_output.pio_base = malloc ((unsigned) pz)) == NULL) ! 207: return ps_seterr (ps, PS_ERR_NMEM, NOTOK); ! 208: pt -> ps_input.pio_bufsiz = pz, pt -> ps_output.pio_cnt = 0; ! 209: pt -> ps_input.pio_ptr = pt -> ps_input.pio_base; ! 210: ! 211: pt -> ps_output.pio_bufsiz = pt -> ps_output.pio_cnt = pz; ! 212: pt -> ps_output.pio_ptr = pt -> ps_output.pio_base; ! 213: ! 214: return OK; ! 215: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.