BSD 4_3 release
[unix-history] / usr / src / usr.bin / uucp / aculib / cds224.c
#ifndef lint
static char sccsid[] = "@(#)cds224.c 1.1 (Berkeley) 1/13/86";
#endif !lint
#include "../condevs.h"
#ifdef CDS224
/*
* conopn: establish dial-out connection through a Concord CDS 224.
* Returns descriptor open to tty for reading and writing.
* Negative values (-1...-7) denote errors in connmsg.
* Be sure to disconnect tty when done, via HUPCL or stty 0.
*/
#define TRYS 5 /* number of trys */
cdsopn224(telno, flds, dev)
char *telno;
char *flds[];
struct Devices *dev;
{
int dh = -1;
int i, ok, er = 0, delay;
extern errno;
char dcname[20];
char *tempbuf[20];
sprintf(dcname, "/dev/%s", dev->D_line);
if (setjmp(Sjbuf)) {
DEBUG(1, "timeout concord open\n", "");
logent("concord open", "TIMEOUT");
if (dh >= 0)
cdscls224(dh);
delock(dev->D_line);
return CF_NODEV;
}
signal(SIGALRM, alarmtr);
getnextfd();
alarm(10);
dh = open(dcname, 2);
alarm(0);
/* modem is open */
next_fd = -1;
if (dh < 0) {
delock(dev->D_line);
return CF_NODEV;
}
fixline(dh, dev->D_speed);
DEBUG(4, "calling %s -> ", telno);
if (dochat(dev, flds, dh)) {
logent(dcname, "CHAT FAILED");
cdscls224(dh);
return CF_DIAL;
}
for(i = 0; i < TRYS; ++i) {
/* wake up Concord */
write(dh, "\r\r", 2);
DEBUG(4, "wanted CDS >", CNULL);
ok = expect("CDS >", dh);
DEBUG(4, "got %s\n", ok ? "?" : "that");
if (ok != 0)
continue;
write(dh, "\r", 2);
DEBUG(4, "wanted CDS >", CNULL);
ok = expect("CDS >", dh);
DEBUG(4, "got %s\n", ok ? "?" : "that");
if (ok != 0)
continue;
/* send telno \r */
sprintf(tempbuf,"D%s\r",telno);
write(dh, tempbuf, strlen(tempbuf));
DEBUG(4, "wanted DIALING ", CNULL);
ok = expect("DIALING ", dh);
DEBUG(4, "got %s\n", ok ? "?" : "that");
if (ok == 0)
break;
}
if (ok == 0) {
sleep(10); /* give concord some time */
DEBUG(4, "wanted INITIATING " , CNULL);
ok = expect("INITIATING", dh);
DEBUG(4, "got %s\n", ok ? "?" : "that");
}
if (ok != 0) {
if (dh > 2)
close(dh);
DEBUG(4, "conDial failed\n", CNULL);
delock(dev->D_line);
return CF_DIAL;
}
DEBUG(4, "concord ok\n", CNULL);
return dh;
}
cdscls224(fd)
{
if (fd > 0) {
close(fd);
sleep(5);
delock(devSel);
}
}
#endif CDS224