BSD 4_4 release
[unix-history] / usr / src / usr.bin / uucp / libacu / df12.c
/*-
* Copyright (c) 1985, 1993
* The Regents of the University of California. All rights reserved.
*
* This module is believed to contain source code proprietary to AT&T.
* Use and redistribution is subject to the Berkeley Software License
* Agreement and your Software Agreement with AT&T (Western Electric).
*/
#ifndef lint
static char sccsid[] = "@(#)df12.c 8.1 (Berkeley) 6/6/93";
#endif /* not lint */
#include "condevs.h"
/*
* df12popn(telno, flds, dev) connect to df12 modem (pulse call)
* df12topn(telno, flds, dev) connect to df12 modem (tone call)
* char *flds[], *dev[];
*
* return codes:
* >0 - file number - ok
* CF_DIAL,CF_NODEV - failed
*/
df12popn (telno, flds, dev)
char *telno,
*flds[];
struct Devices *dev;
{
return df12opn (telno, flds, dev, 0);
}
df12topn (telno, flds, dev)
char *telno,
*flds[];
struct Devices *dev;
{
return df12opn (telno, flds, dev, 1);
}
/* ARGSUSED */
df12opn (telno, flds, dev, toneflag)
char *telno;
char *flds[];
struct Devices *dev;
int toneflag;
{
int phindex, dh = -1;
extern errno;
char dcname[20], newphone[64];
sprintf (dcname, "/dev/%s", dev -> D_line);
DEBUG (4, "dc - %s\n", dcname);
if (setjmp (Sjbuf))
{
logent (dcname, "TIMEOUT");
if (dh >= 0)
close (dh);
return CF_DIAL;
}
signal (SIGALRM, alarmtr);
getnextfd ();
alarm (10);
dh = open (dcname, 2);/* read/write */
alarm (0);
/* modem is open */
/* First, adjust our phone number string. These modems don't
* like any characters but digits and "=" signs (for delay)
*/
for (phindex = 0; *telno; telno++)
{
if (*telno == '=' || (*telno >= '0' && *telno <= '9'))
newphone[phindex++] = *telno;
if (phindex == 64)
{
logent (dcname, "Phone number too long");
close (dh);
return CF_DIAL;
}
}
newphone[phindex] = '\0';
next_fd = -1;
if (dh >= 0)
{
fixline (dh, dev -> D_speed);
if (dochat (dev, flds, dh))
{
logent (dcname, "CHAT FAILED");
close (dh);
return CF_DIAL;
}
slowrite (dh, "\02");
if (expect ("Ready\r\n", dh) != 0)
{
DEBUG (4, "Didn't get 'Ready' response.\n", NULL);
logent (dcname, "Modem not responding");
close (dh);
return CF_DIAL;
}
DEBUG (4, "Got 'Ready' response\n", NULL);
DEBUG (7, "Writing control select flag %c\n", toneflag ? 'T' : 'P');
slowrite (dh, toneflag ? "T" : "P");
DEBUG (4, "Writing telephone number %s\n", newphone);
slowrite (dh, newphone);
DEBUG (7, "Telephone number written\n", NULL);
slowrite (dh, "#");
DEBUG (7, "Writing # sign\n", NULL);
if (expect ("Attached\r\n", dh) != 0)
{
logent (dcname, "No carrier");
strcpy (devSel, dev -> D_line);
df12cls (dh);
return CF_DIAL;
}
}
if (dh < 0)
{
logent (dcname, "CAN'T OPEN");
return CF_NODEV;
}
else
{
DEBUG (4, "df12 ok\n", CNULL);
return dh;
}
}
df12cls (fd)
int fd;
{
char dcname[20];
struct sgttyb hup,
sav;
if (fd > 0)
{
sprintf (dcname, "/dev/%s", devSel);
DEBUG (4, "Hanging up fd = %d\n", fd);
/*
* code to drop DTR -- change to 0 baud then back to default.
*/
gtty (fd, &hup);
gtty (fd, &sav);
hup.sg_ispeed = B0;
hup.sg_ospeed = B0;
stty (fd, &hup);
sleep (2);
stty (fd, &sav);
/*
* now raise DTR -- close the device & open it again.
*/
sleep (2);
close (fd);
sleep (2);
delock (devSel);
}
}