|
|
researchv10 Norman
#
/*
* dpd -- data-phone daemon dispatcher
*
*/
#define SPIDER 0
#define PHONE 1
#define LPD 0
#define FGET 0
char dname[] = "DPDP";
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"
/*
* The remaining part is the data phone interface.
*/
#define NCONERR 4
#define BUSY -1
#define TIMEOUT -2
#define BADID -3
#define ERROR -4
char conerr[NCONERR+1][8] = {"BUSY","TIMEOUT","BAD ID","ERROR","UNKNOWN"};
#define FC4 0104
#define FC10 0110
#define OC 0100
#define ACKOC 0102
#define MCBCD 0110
#define MCBIN 0120
#define RS 036
#define ETX 03
#define MASK6 077
char snumbf[] = "/usr/spool/dpd/snumb";
char scard[] = "H$ snumb XXxxx,31\036\003";
char rcd[] = "H$*$rcd\036\003";
FILE *cfb = NULL;
int snum = 0;
int ioc;
dem_con()
{
int i;
if((i = connect(phone_id)) < 0) {
if((i = -i) > NCONERR+1) i = NCONERR+1;
logerr("Can't reach GCOS: %-8s", conerr[i-1]);
return(i);
}
if((ioc = gerts(FC4, OC, rcd, NULL)) != ACKOC){
dem_dis();
logerr("Bad ACK on rcd: ACK-OC = %-11o", ioc);
return(1);
}
return(0);
}
dem_dis()
{
gerts_dis();
FCLOSE(dfb);
FCLOSE(cfb);
}
dem_open(file)
char *file;
{
}
dem_close()
{
}
get_snumb()
{
FILE *f;
int i, temp;
if((f = fopen(snumbf, "r")) != NULL){
fread((char *)&snum, 2, 1, f);
fclose(f);
}
snum++;
scard[16] = phone_id[0];
scard[17] = phone_id[1];
temp = snum;
for(i = 20; i > 17; i--){
scard[i] = (temp % 10) | '0';
temp = temp/10;
}
scard[21] = ',';
if(temp > 0)
snum = 0;
if((f = fopen(snumbf, "w")) == NULL)
trouble("Can't write %s", snumbf);
fwrite((char *)&snum, 2, 1, f);
fclose(f);
gwrite(FC4, scard, 25);
snumb = &scard[16];
scard[21] = 0;
}
lwrite()
{
line[0] = MCBCD;
line[linel++] = RS;
if(line[1] == '$')
gwrite(FC4, line, linel);
else
gwrite(FC10, line, linel);
}
sascii(fff)
{
static char obuf[400];
int io, j1, j2;
int c1, c2, eof;
int temp;
extern char gcset[];
if((cfb = fopen(&line[1], "r")) == NULL){
logerr("Can't open %s", &line[1]);
return(0);
}
io = eof = 0;
if(fff)
c1 = ff;
else
if((c1 = getc(cfb)) == EOF)
eof = 1;
while(eof == 0){
for(j1 = 1; j1 <= 2; j1++){
obuf[io++] = MCBIN;
for(j2 = 1; j2 <= 52; j2++){
obuf[io++] = gcset[c1>>3 & MASK6];
if((c2 = getc(cfb)) == EOF){
c2 = 0;
eof = 1;
}
temp = (c1<<3 | (c2>>6 & 07));
obuf[io++] = gcset[temp & MASK6];
obuf[io++] = gcset[c2 & MASK6];
if((c1 = getc(cfb)) == EOF)
eof = 1;
if(eof)
break;
}
obuf[io++] = RS;
if(eof)
break;
}
gwrite(FC10, obuf, io);
io = 0;
}
FCLOSE(cfb);
return(0);
}
gwrite(fc, b, n)
int fc;
char *b;
int n;
{
register i;
static char outbuf[402];
b[n] = ETX;
ioc = gerts(fc, OC, b, outbuf);
for(i = 0; i <= 10; i++){
if(ioc == ACKOC){
snsum += n-2;
return;
}
#ifdef DEBUG
for(i = 1; outbuf[i] != ETX && i < 400; i++) ;
outbuf[i+1] = 0;
fprintf(stderr, "ioc=%o, fc=%o, buf='%s'.\n",
ioc, outbuf[0], &outbuf[1]);
#endif
if(ioc != 0100)
break;
ioc = gerts(0115, OC, NULL, outbuf);
}
trouble("write error: ioc =%6o, pid %-6s",
ioc, dfname+LPID);
}
/* VARARGS */
trouble(s, a1, a2, a3, a4)
char *s;
int a1, a2, a3, a4;
{
FCLOSE(dfb);
FCLOSE(cfb);
if(retcode != 0)
gerts_dis();
logerr(s, a1, a2, a3, a4);
longjmp(env, 1);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.