|
|
1.1 root 1: /*
2: * I/O routines to retrieve files from GCOS via Spider
3: */
4:
5: #include <stdio.h>
6:
7: #define SPIDER 1
8: #define PHONE 0
9: #define LPD 0
10: #define FGET 1
11:
12: char dname[] = "FGETS";
13:
14: #include "gcos.c"
15: #include "fgdemon.c"
16:
17: /* nak codes --
18: * I illegal
19: * B dest busy
20: * S illegal gcos command
21: * G gcos down/no resp
22: */
23:
24: #define SETSIG 0
25: #define GETSIG 1
26: #define GETCHN 2
27: #define GETTRB 3
28: #define SETEOF 4
29: #define CLREOF 5
30:
31: int COMM[] = {3};
32: int DATA[] = {1};
33: int SPEOF[] = {2};
34: int TERM[] = {4};
35:
36: char sndev[] = "/dev/tiu/d2";
37: #define LIDMES 4
38: char idmes[LIDMES+1] = "gXXa";
39:
40: int sfd = -1; /*spider file*/
41: int rathole[1];
42: int errno;
43: int ioerr;
44: char sbuf[BUFSIZ];
45:
46: fgd_read()
47: {
48: int nr, i;
49: extern hungup();
50:
51: /* allow 50 seconds to open the file and get going */
52:
53: signal(SIGALRM, hungup);
54: alarm(50);
55:
56: if ((sfd = open(sndev, 2)) < 0) {
57: ioerr = errno;
58: if (ioerr == EBUSY)
59: trouble(OKTRB, 10, "unix chan bsy");
60: else
61: trouble(FATTRB, 0, "TIU down %d, 201 used", ioerr);
62: }
63:
64: snstat(sfd, rathole, GETTRB);
65: snstat(sfd, COMM, SETSIG);
66:
67: idmes[1] = fget_id[0];
68: idmes[2] = fget_id[1];
69: if (nr = write(sfd, idmes, LIDMES) != LIDMES) {
70: if((nr=write(sfd,idmes,LIDMES))!=LIDMES){ /*try once again*/
71: snstat(sfd, rathole, GETTRB);
72: trouble(BADTRB, 20, "wrote 4, sent %d, error %o, 201 used",
73: nr,rathole[0]&0377);
74: }
75: }
76:
77: #ifdef DEBUG
78: fprintf(stderr, "sent %s\n", idmes); /* PRINTF */
79: #endif
80:
81: if (read(sfd, sbuf, BUFSIZ) <= 0) {
82: ioerr = errno;
83: snstat(sfd, rathole, GETTRB);
84: trouble(BADTRB, 20, "read1 err %d tbyte %o, 201 used", ioerr, rathole[0]&0377);
85: }
86:
87: #ifdef DEBUG
88: fprintf(stderr, "acknowledgement: %c\n", sbuf[0]); /* PRINTF */
89: #endif
90:
91: if (sbuf[0] != '+') {
92: if (sbuf[0] == 'B')
93: trouble(OKTRB, 10, "pdp8 busy ");
94:
95: if (sbuf[0] == 'G')
96: trouble(OKTRB, -120, "gcos down");
97:
98: trouble(FATTRB, 0, "nak %c, 201 used", sbuf[0]);
99:
100: }
101:
102: while ( (nr = read(sfd, sbuf, BUFSIZ)) > 0 ) {
103:
104: alarm(240);
105:
106: #ifdef DEBUG
107: fprintf(stderr, "chars read = %d\n", nr); /* PRINTF */
108: #endif
109: for ( i = 0; i < nr; i += sbuf[i+1]+2 ) {
110:
111: #ifdef DEBUG
112: /* fprintf(stderr, "sbuf[i], sbuf[i+1] = %d %d\n",
113: sbuf[i],sbuf[i+1]); /* PRINTF */
114: #endif
115: switch ( sbuf[i] ) {
116:
117: case 0:
118: (*output)(&sbuf[i+2], sbuf[i+1]);
119: break;
120:
121: case 1:
122: case 2:
123: #ifdef DEBUG
124: sbuf[i+sbuf[i+1]+1] = '\0'; /* PRINTF */
125: fprintf(stderr, "misc card - %s\n", &sbuf[i+2]); /* PRINTF */
126: #endif
127: output = ignore;
128: break;
129:
130: case 3:
131: #ifdef DEBUG
132: fprintf(stderr, "binary card - %o\n",sbuf[i+2]); /* PRINTF */
133: #endif
134: if (((sbuf[i+2]&0377) == 0377)
135: && ((sbuf[i+3]&0377) == 0360)) endfile();
136: else output = ignore;
137: break;
138:
139: default:
140: if((tfd = fopen(badbuf, "w")) != NULL){
141: fwrite(sbuf, 1, nr, tfd);
142: FCLOSE(tfd);
143: }
144: trouble(FATTRB, 0, "bad record type %d, 201 used", sbuf[i]);
145:
146: }
147:
148: }
149:
150: }
151:
152: if (nr < 0) {
153: ioerr = errno;
154: snstat(sfd, rathole, GETTRB);
155: gotit = 0;
156: trouble(BADTRB, 20, "read2 err %d tbyte %o, 201 used", ioerr, rathole[0]&0377);
157: }
158:
159: snstat(sfd, rathole, GETSIG);
160: if ((rathole[0]&0377) != 4)
161: trouble(FATTRB, 0, "unexpected signal byte %d, 201 used", rathole[0]&377);
162: }
163:
164:
165: dem_dis()
166: {
167: FCLOSE(ofd);
168: FCLOSE(tfd);
169: if(sfd >= 0){
170: close(sfd);
171: sfd = -1;
172: }
173: }
174:
175:
176: hungup()
177: {
178: trouble(BADTRB, 10, "timeout, 201 used");
179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.