|
|
1.1 ! root 1: # ! 2: /* ! 3: * dpd -- data-phone daemon dispatcher using spider ! 4: * ! 5: */ ! 6: ! 7: #include <errno.h> ! 8: ! 9: #define SPIDER 1 ! 10: #define PHONE 0 ! 11: #define LPD 0 ! 12: #define FGET 0 ! 13: ! 14: #define TIMEOUT 100 ! 15: ! 16: char dname[] = "DPDS"; ! 17: char dpd[] = "/usr/spool/dpd"; ! 18: char dfname[30] = "/usr/spool/dpd/"; ! 19: char lock[] = "/usr/spool/dpd/lock"; ! 20: char error[] = "/usr/spool/dpd/errors"; ! 21: ! 22: #include "daemon.c" ! 23: #include "gcos.c" ! 24: ! 25: /* nak codes -- ! 26: * i illegal ! 27: * b dest busy ! 28: * s illegal gcos command ! 29: * g gcos down/no resp ! 30: */ ! 31: #define SETSIG 0 ! 32: #define GETSIG 1 ! 33: #define GETCHN 2 ! 34: #define GETTRB 3 ! 35: #define SETEOF 4 ! 36: #define CLREOF 5 ! 37: ! 38: int COMM[] = {3}; ! 39: int DATA[] = {1}; ! 40: int SPEOF[] = {2}; ! 41: int TERM[] = {4}; ! 42: ! 43: #define LIDMES 9 ! 44: char idmes[LIDMES+1] = "gXXrxxxxx"; ! 45: char sndev[] = "/dev/tiu/d2"; ! 46: ! 47: FILE *cfb = NULL; /*data file*/ ! 48: char ibuf[64]; ! 49: int snf = -1; /*spider device*/ ! 50: int rathole[1]; ! 51: int errno; ! 52: ! 53: dem_con() ! 54: { ! 55: return(0); ! 56: } ! 57: ! 58: dem_dis() ! 59: { ! 60: FCLOSE(dfb); ! 61: FCLOSE(cfb); ! 62: if(snf >= 0){ ! 63: close(snf); ! 64: snf = -1; ! 65: } ! 66: } ! 67: ! 68: dem_open(file) ! 69: char *file; ! 70: { ! 71: static lastbad, badcount; ! 72: int badexit(); ! 73: ! 74: signal(SIGALRM, badexit); ! 75: /* ! 76: * Only allow 30 seconds to open file. ! 77: */ ! 78: alarm(30); ! 79: if ((snf = open(sndev, 2)) < 0) { ! 80: if (errno == EBUSY) ! 81: trouble("NG: Channel busy "); ! 82: else { ! 83: retcode = TIMEOUT; ! 84: trouble("NG: Can't find TIU file "); ! 85: } ! 86: } ! 87: snstat(snf, rathole, GETTRB); ! 88: snstat(snf, COMM, SETSIG); ! 89: idmes[1] = spider_id[0]; ! 90: idmes[2] = spider_id[1]; ! 91: snwrite(idmes, LIDMES); ! 92: if (read(snf, ibuf, 10) <= 0) { ! 93: snstat(snf, rathole, GETTRB); ! 94: trouble("read err %d %d, pid %8s", errno, rathole[0]&0377, ! 95: file+LPID); ! 96: } ! 97: if (ibuf[0]!='+') { ! 98: if (lastbad=='B' && ibuf[0]=='B' && badcount>=4){ ! 99: /*reboot PDP8 on 4th consecutive ! 100: busy response (~1+2+4+8=15 minutes) ! 101: */ ! 102: lastbad=badcount=0; /*forget we've had busies*/ ! 103: waittm=60; /*setup for retry after one minute*/ ! 104: snstat(snf, COMM, SETSIG); ! 105: snwrite("b", 1); ! 106: trouble("Another NAK:B, reboot "); ! 107: } ! 108: lastbad = ibuf[0]; ! 109: badcount = lastbad=='B'?++badcount:0; ! 110: trouble("NAK:%-22c", ibuf[0]); ! 111: } ! 112: lastbad=badcount=0; ! 113: snumb = &ibuf[1]; ! 114: snumb[5] = 0; ! 115: } ! 116: ! 117: get_snumb() ! 118: { ! 119: } ! 120: ! 121: lwrite() ! 122: { ! 123: setcom('h'); ! 124: line[linel] = '\n'; ! 125: snwrite(&line[1], linel); ! 126: } ! 127: ! 128: dem_close() ! 129: { ! 130: snstat(snf, COMM, SETSIG); ! 131: snwrite("t\001", 2); ! 132: snstat(snf, TERM, SETSIG); ! 133: snwrite((char *)0, 0); ! 134: /* ! 135: read(snf, ibuf, 10); ! 136: */ ! 137: } ! 138: ! 139: sascii(fff) ! 140: { ! 141: register n; ! 142: static char buf[BUFSIZ]; ! 143: ! 144: if((cfb = fopen(&line[1], "r")) == NULL){ ! 145: logerr("Can't open %s", &line[1]); ! 146: return(0); ! 147: } ! 148: setcom('a'); ! 149: snstat(snf, DATA, SETSIG); ! 150: if (fff) ! 151: snwrite(&ff, 1); ! 152: while ((n=fread(buf, 1, BUFSIZ, cfb))==BUFSIZ) { ! 153: snwrite(buf, BUFSIZ); ! 154: } ! 155: if (n<0) ! 156: n = 0; ! 157: snstat(snf, SPEOF, SETSIG); ! 158: snwrite(buf, n); ! 159: FCLOSE(cfb); ! 160: return(0); ! 161: } ! 162: ! 163: setcom(c) ! 164: char c; ! 165: { ! 166: snstat(snf, COMM, SETSIG); ! 167: snwrite(&c, 1); ! 168: snstat(snf, SPEOF, SETSIG); ! 169: } ! 170: ! 171: snwrite(b, n) ! 172: char *b; ! 173: int n; ! 174: { ! 175: int ercode; ! 176: register nw; ! 177: ! 178: alarm(30); ! 179: nw = write(snf, b, n); ! 180: ercode = 0; ! 181: snstat(snf, &ercode, GETTRB); ! 182: if (nw!=n || ercode) { ! 183: if (ercode >= 0100) ! 184: retcode = TIMEOUT; ! 185: trouble("wrote %d sent %d err %o, %s", ! 186: n, nw, ercode&0377, dfname+LPID); ! 187: } ! 188: snsum += n; ! 189: } ! 190: ! 191: /* VARARGS */ ! 192: trouble(s, a1, a2, a3, a4) ! 193: char *s; ! 194: int a1, a2, a3, a4; ! 195: { ! 196: alarm(0); ! 197: sleep(8); /* temporary to overcome timing problem in pdp8 ADH */ ! 198: dem_dis(); ! 199: logerr(s, a1, a2, a3, a4); ! 200: sleep(5); ! 201: if (retcode==TIMEOUT) { ! 202: /* ! 203: * Give up. ! 204: */ ! 205: unlink(lock); ! 206: execl("/usr/lib/odpd", "odpd", (char *)0); ! 207: execl("/etc/odpd", "odpd", (char *)0); ! 208: execl("/usr/lib/dpd", "dpd", (char *)0); ! 209: execl("/etc/dpd", "dpd", (char *)0); ! 210: logerr("Can't find dpd."); ! 211: exit(1); ! 212: } ! 213: longjmp(env, 1); ! 214: } ! 215: ! 216: badexit() ! 217: { ! 218: if (waittm >= 2*60) { /* Second try */ ! 219: retcode = TIMEOUT; ! 220: trouble("Another timeout, I give up"); ! 221: } ! 222: trouble("Timed out. "); ! 223: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.