|
|
researchv10 Norman
#
/*
* dpd -- data-phone daemon dispatcher using spider
*
*/
#include <errno.h>
#define SPIDER 1
#define PHONE 0
#define LPD 0
#define FGET 0
#define TIMEOUT 100
char dname[] = "DPDS";
char dpd[] = "/usr/spool/dpd";
char dfname[30] = "/usr/spool/dpd/";
char lock[] = "/usr/spool/dpd/lock";
char error[] = "/usr/spool/dpd/errors";
#include "daemon.c"
#include "gcos.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};
#define LIDMES 9
char idmes[LIDMES+1] = "gXXrxxxxx";
char sndev[] = "/dev/tiu/d2";
FILE *cfb = NULL; /*data file*/
char ibuf[64];
int snf = -1; /*spider device*/
int rathole[1];
int errno;
dem_con()
{
return(0);
}
dem_dis()
{
FCLOSE(dfb);
FCLOSE(cfb);
if(snf >= 0){
close(snf);
snf = -1;
}
}
dem_open(file)
char *file;
{
static lastbad, badcount;
int badexit();
signal(SIGALRM, badexit);
/*
* Only allow 30 seconds to open file.
*/
alarm(30);
if ((snf = open(sndev, 2)) < 0) {
if (errno == EBUSY)
trouble("NG: Channel busy ");
else {
retcode = TIMEOUT;
trouble("NG: Can't find TIU file ");
}
}
snstat(snf, rathole, GETTRB);
snstat(snf, COMM, SETSIG);
idmes[1] = spider_id[0];
idmes[2] = spider_id[1];
snwrite(idmes, LIDMES);
if (read(snf, ibuf, 10) <= 0) {
snstat(snf, rathole, GETTRB);
trouble("read err %d %d, pid %8s", errno, rathole[0]&0377,
file+LPID);
}
if (ibuf[0]!='+') {
if (lastbad=='B' && ibuf[0]=='B' && badcount>=4){
/*reboot PDP8 on 4th consecutive
busy response (~1+2+4+8=15 minutes)
*/
lastbad=badcount=0; /*forget we've had busies*/
waittm=60; /*setup for retry after one minute*/
snstat(snf, COMM, SETSIG);
snwrite("b", 1);
trouble("Another NAK:B, reboot ");
}
lastbad = ibuf[0];
badcount = lastbad=='B'?++badcount:0;
trouble("NAK:%-22c", ibuf[0]);
}
lastbad=badcount=0;
snumb = &ibuf[1];
snumb[5] = 0;
}
get_snumb()
{
}
lwrite()
{
setcom('h');
line[linel] = '\n';
snwrite(&line[1], linel);
}
dem_close()
{
snstat(snf, COMM, SETSIG);
snwrite("t\001", 2);
snstat(snf, TERM, SETSIG);
snwrite((char *)0, 0);
/*
read(snf, ibuf, 10);
*/
}
sascii(fff)
{
register n;
static char buf[BUFSIZ];
if((cfb = fopen(&line[1], "r")) == NULL){
logerr("Can't open %s", &line[1]);
return(0);
}
setcom('a');
snstat(snf, DATA, SETSIG);
if (fff)
snwrite(&ff, 1);
while ((n=fread(buf, 1, BUFSIZ, cfb))==BUFSIZ) {
snwrite(buf, BUFSIZ);
}
if (n<0)
n = 0;
snstat(snf, SPEOF, SETSIG);
snwrite(buf, n);
FCLOSE(cfb);
return(0);
}
setcom(c)
char c;
{
snstat(snf, COMM, SETSIG);
snwrite(&c, 1);
snstat(snf, SPEOF, SETSIG);
}
snwrite(b, n)
char *b;
int n;
{
int ercode;
register nw;
alarm(30);
nw = write(snf, b, n);
ercode = 0;
snstat(snf, &ercode, GETTRB);
if (nw!=n || ercode) {
if (ercode >= 0100)
retcode = TIMEOUT;
trouble("wrote %d sent %d err %o, %s",
n, nw, ercode&0377, dfname+LPID);
}
snsum += n;
}
/* VARARGS */
trouble(s, a1, a2, a3, a4)
char *s;
int a1, a2, a3, a4;
{
alarm(0);
sleep(8); /* temporary to overcome timing problem in pdp8 ADH */
dem_dis();
logerr(s, a1, a2, a3, a4);
sleep(5);
if (retcode==TIMEOUT) {
/*
* Give up.
*/
unlink(lock);
execl("/usr/lib/odpd", "odpd", (char *)0);
execl("/etc/odpd", "odpd", (char *)0);
execl("/usr/lib/dpd", "dpd", (char *)0);
execl("/etc/dpd", "dpd", (char *)0);
logerr("Can't find dpd.");
exit(1);
}
longjmp(env, 1);
}
badexit()
{
if (waittm >= 2*60) { /* Second try */
retcode = TIMEOUT;
trouble("Another timeout, I give up");
}
trouble("Timed out. ");
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.