V10/cmd/daemon/phone.dpd.c

Compare this file to the similar file:
Show the results in this format:

#
/*
 * 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);
}