|
|
1.1 root 1: #
2: /*
3: * dpd -- data-phone daemon dispatcher
4: *
5: */
6:
7: #define SPIDER 0
8: #define PHONE 1
9: #define LPD 0
10: #define FGET 0
11:
12: char dname[] = "DPDP";
13: char dpd[] = "/usr/spool/dpd";
14: char dfname[30] = "/usr/spool/dpd/";
15: char lock[] = "/usr/spool/dpd/lock";
16: char error[] = "/usr/spool/dpd/errors";
17:
18: #include "daemon.c"
19: #include "gcos.c"
20:
21: /*
22: * The remaining part is the data phone interface.
23: */
24:
25: #define NCONERR 4
26: #define BUSY -1
27: #define TIMEOUT -2
28: #define BADID -3
29: #define ERROR -4
30: char conerr[NCONERR+1][8] = {"BUSY","TIMEOUT","BAD ID","ERROR","UNKNOWN"};
31:
32: #define FC4 0104
33: #define FC10 0110
34: #define OC 0100
35: #define ACKOC 0102
36: #define MCBCD 0110
37: #define MCBIN 0120
38: #define RS 036
39: #define ETX 03
40: #define MASK6 077
41:
42: char snumbf[] = "/usr/spool/dpd/snumb";
43: char scard[] = "H$ snumb XXxxx,31\036\003";
44: char rcd[] = "H$*$rcd\036\003";
45:
46: FILE *cfb = NULL;
47: int snum = 0;
48: int ioc;
49:
50: dem_con()
51: {
52: int i;
53:
54: if((i = connect(phone_id)) < 0) {
55: if((i = -i) > NCONERR+1) i = NCONERR+1;
56: logerr("Can't reach GCOS: %-8s", conerr[i-1]);
57: return(i);
58: }
59: if((ioc = gerts(FC4, OC, rcd, NULL)) != ACKOC){
60: dem_dis();
61: logerr("Bad ACK on rcd: ACK-OC = %-11o", ioc);
62: return(1);
63: }
64: return(0);
65: }
66:
67: dem_dis()
68: {
69: gerts_dis();
70: FCLOSE(dfb);
71: FCLOSE(cfb);
72: }
73:
74: dem_open(file)
75: char *file;
76: {
77: }
78:
79: dem_close()
80: {
81: }
82:
83: get_snumb()
84: {
85: FILE *f;
86: int i, temp;
87:
88: if((f = fopen(snumbf, "r")) != NULL){
89: fread((char *)&snum, 2, 1, f);
90: fclose(f);
91: }
92: snum++;
93: scard[16] = phone_id[0];
94: scard[17] = phone_id[1];
95: temp = snum;
96: for(i = 20; i > 17; i--){
97: scard[i] = (temp % 10) | '0';
98: temp = temp/10;
99: }
100: scard[21] = ',';
101: if(temp > 0)
102: snum = 0;
103: if((f = fopen(snumbf, "w")) == NULL)
104: trouble("Can't write %s", snumbf);
105: fwrite((char *)&snum, 2, 1, f);
106: fclose(f);
107: gwrite(FC4, scard, 25);
108: snumb = &scard[16];
109: scard[21] = 0;
110: }
111:
112: lwrite()
113: {
114: line[0] = MCBCD;
115: line[linel++] = RS;
116: if(line[1] == '$')
117: gwrite(FC4, line, linel);
118: else
119: gwrite(FC10, line, linel);
120: }
121:
122:
123: sascii(fff)
124: {
125: static char obuf[400];
126: int io, j1, j2;
127: int c1, c2, eof;
128: int temp;
129: extern char gcset[];
130:
131: if((cfb = fopen(&line[1], "r")) == NULL){
132: logerr("Can't open %s", &line[1]);
133: return(0);
134: }
135: io = eof = 0;
136: if(fff)
137: c1 = ff;
138: else
139: if((c1 = getc(cfb)) == EOF)
140: eof = 1;
141: while(eof == 0){
142: for(j1 = 1; j1 <= 2; j1++){
143: obuf[io++] = MCBIN;
144: for(j2 = 1; j2 <= 52; j2++){
145: obuf[io++] = gcset[c1>>3 & MASK6];
146: if((c2 = getc(cfb)) == EOF){
147: c2 = 0;
148: eof = 1;
149: }
150: temp = (c1<<3 | (c2>>6 & 07));
151: obuf[io++] = gcset[temp & MASK6];
152: obuf[io++] = gcset[c2 & MASK6];
153: if((c1 = getc(cfb)) == EOF)
154: eof = 1;
155: if(eof)
156: break;
157: }
158: obuf[io++] = RS;
159: if(eof)
160: break;
161: }
162: gwrite(FC10, obuf, io);
163: io = 0;
164: }
165: FCLOSE(cfb);
166: return(0);
167: }
168:
169: gwrite(fc, b, n)
170: int fc;
171: char *b;
172: int n;
173: {
174: register i;
175: static char outbuf[402];
176:
177: b[n] = ETX;
178: ioc = gerts(fc, OC, b, outbuf);
179: for(i = 0; i <= 10; i++){
180: if(ioc == ACKOC){
181: snsum += n-2;
182: return;
183: }
184: #ifdef DEBUG
185: for(i = 1; outbuf[i] != ETX && i < 400; i++) ;
186: outbuf[i+1] = 0;
187: fprintf(stderr, "ioc=%o, fc=%o, buf='%s'.\n",
188: ioc, outbuf[0], &outbuf[1]);
189: #endif
190: if(ioc != 0100)
191: break;
192: ioc = gerts(0115, OC, NULL, outbuf);
193: }
194: trouble("write error: ioc =%6o, pid %-6s",
195: ioc, dfname+LPID);
196: }
197:
198: /* VARARGS */
199: trouble(s, a1, a2, a3, a4)
200: char *s;
201: int a1, a2, a3, a4;
202: {
203:
204: FCLOSE(dfb);
205: FCLOSE(cfb);
206: if(retcode != 0)
207: gerts_dis();
208: logerr(s, a1, a2, a3, a4);
209: longjmp(env, 1);
210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.