2.11BSD/src/usr.bin/uucp/aculib/hys24.c
#ifndef lint
static char sccsid[] = "@(#)hys24.c 1.1 (Berkeley) 1/13/86";
#endif !lint
#include "../condevs.h"
#ifdef HAYES2400
/*
* hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call)
* hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call)
* char *flds[], *dev[];
*
* return codes:
* >0 - file number - ok
* CF_DIAL,CF_DEVICE - failed
*/
hyspopn24(telno, flds, dev)
char *telno, *flds[];
struct Devices *dev;
{
return hysopn24(telno, flds, dev, 0);
}
hystopn24(telno, flds, dev)
char *telno, *flds[];
struct Devices *dev;
{
return hysopn24(telno, flds, dev, 1);
}
/* ARGSUSED */
hysopn24(telno, flds, dev, toneflag)
char *telno;
char *flds[];
struct Devices *dev;
int toneflag;
{
int dh = -1;
char *ii;
extern errno;
char dcname[20];
sprintf(dcname, "/dev/%s", dev->D_line);
DEBUG(4, "dc - %s\n", dcname);
if (setjmp(Sjbuf)) {
logent(dcname, "TIMEOUT");
if (dh >= 0)
hyscls24(dh);
return CF_DIAL;
}
signal(SIGALRM, alarmtr);
getnextfd();
alarm(10);
dh = open(dcname, 2); /* read/write */
alarm(0);
for (ii = telno; *ii; ii++)
if (*ii == '=')
*ii = ',';
/* modem is open */
next_fd = -1;
if (dh >= 0) {
fixline(dh, dev->D_speed);
write(dh, "\rATZH\r", 6);
sleep(2);
if (dochat(dev, flds, dh)) {
logent(dcname, "CHAT FAILED");
hyscls24(dh);
return CF_DIAL;
}
write(dh, "AT&F&D3&C1E0X1\r", 15);
if (expect("OK\r\n", dh) != 0) {
logent(dcname, "HSM not responding OK");
hyscls24(dh);
return CF_DIAL;
}
if (toneflag)
write(dh, "\rATDT", 5);
else
write(dh, "\rATDP", 5);
write(dh, telno, strlen(telno));
write(dh, "\r", 1);
if (expect("CONNECT", dh) != 0) {
logent("HSM no carrier", _FAILED);
strcpy(devSel, dev->D_line);
hyscls24(dh);
return CF_DIAL;
}
}
if (dh < 0) {
logent(dcname, "CAN'T OPEN");
return dh;
}
DEBUG(4, "hayes ok\n", CNULL);
return dh;
}
hyscls24(fd)
int fd;
{
char dcname[20];
if (fd > 0) {
sprintf(dcname, "/dev/%s", devSel);
DEBUG(4, "Hanging up fd = %d\n", fd);
sleep(1);
/*
* Since we have a getty sleeping on this line, when it wakes up it sends
* all kinds of garbage to the modem. Unfortunatly, the modem likes to
* execute the previous command when it sees the garbage. The previous
* command was to dial the phone, so let's make the last command reset
* the modem.
*/
write(fd, "\r+++", 4);
sleep(2);
write(fd, "\rATH\rATZ\r", 9);
sleep(2);
close(fd);
delock(devSel);
}
}
#endif HAYES2400