|
|
1.1 ! root 1: #include <sys/types.h> ! 2: #include <sys/stream.h> ! 3: #include <sys/filio.h> ! 4: #include <sys/ttyio.h> ! 5: #include <stdio.h> ! 6: #include "sysexits.h" ! 7: #include <signal.h> ! 8: #include "tdefs.h" ! 9: #include "udefs.h" ! 10: #include "pupu.h" ! 11: ! 12: /* ! 13: * To avoid race conditions, we remember if mesgld has been pushed. ! 14: * This flag should become a table if there is ever a need for more ! 15: * than one datakit fd open at a time ! 16: */ ! 17: ! 18: static char msgpushed; ! 19: ! 20: static unsigned char eofmsg[] = { M_CTL, MSGMAGIC, 1, 0, 106 }; ! 21: ! 22: dkeof(fd) ! 23: { ! 24: write (fd, eofmsg, sizeof (eofmsg)); ! 25: } ! 26: ! 27: msgwrite (fd, buf, len) ! 28: int fd; ! 29: char *buf; ! 30: int len; ! 31: { ! 32: struct mesg m; ! 33: static struct mesg delim = {M_DELIM, MSGMAGIC, 0, 0}; ! 34: int ret; ! 35: ! 36: if (!msgpushed) { ! 37: extern int mesg_ld; ! 38: ! 39: if (ioctl (fd, FIOPUSHLD, &mesg_ld) < 0) { ! 40: fprintf(stderr, "can't push message line discipline\n"); ! 41: exit(fd); ! 42: } ! 43: msgpushed = 1; ! 44: } ! 45: ! 46: m.type = M_DATA; ! 47: m.magic = MSGMAGIC; ! 48: m.losize = len & 0xff; ! 49: m.hisize = (len >> 8) & 0xff; ! 50: ! 51: db(stderr, "msgwrite %d\n", len); ! 52: if (write (fd, &m, MSGHLEN) != MSGHLEN) { ! 53: perror ("header write"); ! 54: return -1; ! 55: } ! 56: ! 57: ret = len? write (fd, buf, len): 0; ! 58: ! 59: db(stderr, "msgwrite delim\n"); ! 60: if(write (fd, &delim, MSGHLEN) != MSGHLEN){ ! 61: perror ("delim write"); ! 62: return -1; ! 63: } ! 64: ! 65: return ret; ! 66: } ! 67: ! 68: msgread (fd, buf, len) ! 69: int fd; ! 70: char *buf; ! 71: int len; ! 72: { ! 73: struct mesg m; ! 74: static int remain, tossdelim; ! 75: int n, ret = 0; ! 76: ! 77: if (!msgpushed) ! 78: return read (fd, buf, len); ! 79: ! 80: if (remain) { ! 81: n = remain > len? len: remain; ! 82: if (iread (fd, buf, n) != n) ! 83: err ("Can't read trailer", NIL, -EX_PROTOCOL); ! 84: remain -= n; ! 85: return n; ! 86: } ! 87: ! 88: while (len > 0) { ! 89: ! 90: do { ! 91: if (iread (fd, &m, MSGHLEN) != MSGHLEN) ! 92: err ("Stream msg header read error", ! 93: NIL, -EX_PROTOCOL); ! 94: ! 95: if (m.magic != MSGMAGIC) ! 96: err ("Bad msgmagic", NIL, -EX_PROTOCOL); ! 97: ! 98: db(stderr, "msgread type %d len %d\n", m.type, (m.hisize << 8) + m.losize); ! 99: } while (m.type != M_DATA && m.type != M_DELIM && m.type != M_CTL); ! 100: ! 101: if (m.type == M_DELIM) { ! 102: if (!tossdelim) ! 103: return ret; ! 104: tossdelim = 0; ! 105: } else { ! 106: int r = (m.hisize << 8) + m.losize; ! 107: ! 108: if (m.type == M_CTL) { ! 109: char c; ! 110: ! 111: if (r != 1) ! 112: err ("Control message, cnt > 1", NIL, ! 113: -EX_PROTOCOL); ! 114: ! 115: if (iread (fd, &c, r) != r) ! 116: err ("Cannot read control char", NIL, ! 117: -EX_PROTOCOL); ! 118: ! 119: if (c != 106) /* should be symbolic */ ! 120: err ("Unknown control char", NIL, ! 121: -EX_PROTOCOL); ! 122: ! 123: tossdelim = 0; ! 124: } else { ! 125: ! 126: if(r) ! 127: tossdelim = 0; ! 128: if (r > len) { ! 129: remain = r - len; ! 130: r = len; ! 131: } ! 132: ! 133: if (r && iread (fd, buf, r) != r) ! 134: err ("Bad data read", NIL, -EX_PROTOCOL); ! 135: ! 136: buf += r; ! 137: len -= r; ! 138: ret += r; ! 139: } ! 140: } ! 141: } ! 142: ! 143: tossdelim = 1; ! 144: return ret; ! 145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.