|
|
researchv10 Norman
/*
* I/O routines to retrieve files from GCOS via Spider
*/
#include <stdio.h>
#define SPIDER 1
#define PHONE 0
#define LPD 0
#define FGET 1
char dname[] = "FGETS";
#include "gcos.c"
#include "fgdemon.c"
/* nak codes --
* I illegal
* B dest busy
* S illegal gcos command
* G gcos down/no resp
*/
#define SETSIG 0
#define GETSIG 1
#define GETCHN 2
#define GETTRB 3
#define SETEOF 4
#define CLREOF 5
int COMM[] = {3};
int DATA[] = {1};
int SPEOF[] = {2};
int TERM[] = {4};
char sndev[] = "/dev/tiu/d2";
#define LIDMES 4
char idmes[LIDMES+1] = "gXXa";
int sfd = -1; /*spider file*/
int rathole[1];
int errno;
int ioerr;
char sbuf[BUFSIZ];
fgd_read()
{
int nr, i;
extern hungup();
/* allow 50 seconds to open the file and get going */
signal(SIGALRM, hungup);
alarm(50);
if ((sfd = open(sndev, 2)) < 0) {
ioerr = errno;
if (ioerr == EBUSY)
trouble(OKTRB, 10, "unix chan bsy");
else
trouble(FATTRB, 0, "TIU down %d, 201 used", ioerr);
}
snstat(sfd, rathole, GETTRB);
snstat(sfd, COMM, SETSIG);
idmes[1] = fget_id[0];
idmes[2] = fget_id[1];
if (nr = write(sfd, idmes, LIDMES) != LIDMES) {
if((nr=write(sfd,idmes,LIDMES))!=LIDMES){ /*try once again*/
snstat(sfd, rathole, GETTRB);
trouble(BADTRB, 20, "wrote 4, sent %d, error %o, 201 used",
nr,rathole[0]&0377);
}
}
#ifdef DEBUG
fprintf(stderr, "sent %s\n", idmes); /* PRINTF */
#endif
if (read(sfd, sbuf, BUFSIZ) <= 0) {
ioerr = errno;
snstat(sfd, rathole, GETTRB);
trouble(BADTRB, 20, "read1 err %d tbyte %o, 201 used", ioerr, rathole[0]&0377);
}
#ifdef DEBUG
fprintf(stderr, "acknowledgement: %c\n", sbuf[0]); /* PRINTF */
#endif
if (sbuf[0] != '+') {
if (sbuf[0] == 'B')
trouble(OKTRB, 10, "pdp8 busy ");
if (sbuf[0] == 'G')
trouble(OKTRB, -120, "gcos down");
trouble(FATTRB, 0, "nak %c, 201 used", sbuf[0]);
}
while ( (nr = read(sfd, sbuf, BUFSIZ)) > 0 ) {
alarm(240);
#ifdef DEBUG
fprintf(stderr, "chars read = %d\n", nr); /* PRINTF */
#endif
for ( i = 0; i < nr; i += sbuf[i+1]+2 ) {
#ifdef DEBUG
/* fprintf(stderr, "sbuf[i], sbuf[i+1] = %d %d\n",
sbuf[i],sbuf[i+1]); /* PRINTF */
#endif
switch ( sbuf[i] ) {
case 0:
(*output)(&sbuf[i+2], sbuf[i+1]);
break;
case 1:
case 2:
#ifdef DEBUG
sbuf[i+sbuf[i+1]+1] = '\0'; /* PRINTF */
fprintf(stderr, "misc card - %s\n", &sbuf[i+2]); /* PRINTF */
#endif
output = ignore;
break;
case 3:
#ifdef DEBUG
fprintf(stderr, "binary card - %o\n",sbuf[i+2]); /* PRINTF */
#endif
if (((sbuf[i+2]&0377) == 0377)
&& ((sbuf[i+3]&0377) == 0360)) endfile();
else output = ignore;
break;
default:
if((tfd = fopen(badbuf, "w")) != NULL){
fwrite(sbuf, 1, nr, tfd);
FCLOSE(tfd);
}
trouble(FATTRB, 0, "bad record type %d, 201 used", sbuf[i]);
}
}
}
if (nr < 0) {
ioerr = errno;
snstat(sfd, rathole, GETTRB);
gotit = 0;
trouble(BADTRB, 20, "read2 err %d tbyte %o, 201 used", ioerr, rathole[0]&0377);
}
snstat(sfd, rathole, GETSIG);
if ((rathole[0]&0377) != 4)
trouble(FATTRB, 0, "unexpected signal byte %d, 201 used", rathole[0]&377);
}
dem_dis()
{
FCLOSE(ofd);
FCLOSE(tfd);
if(sfd >= 0){
close(sfd);
sfd = -1;
}
}
hungup()
{
trouble(BADTRB, 10, "timeout, 201 used");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.