xref: /csrg-svn/usr.bin/uucp/libacu/df12.c (revision 46875)
118563Sralph #ifndef lint
2*46875Sbostic static char sccsid[] = "@(#)df12.c	4.3 (Berkeley) 03/02/91";
318563Sralph #endif
418563Sralph 
5*46875Sbostic #include "condevs.h"
618563Sralph 
718563Sralph /*
818563Sralph  *	df12popn(telno, flds, dev) connect to df12 modem (pulse call)
918563Sralph  *	df12topn(telno, flds, dev) connect to df12 modem (tone call)
1018563Sralph  *	char *flds[], *dev[];
1118563Sralph  *
1218563Sralph  *	return codes:
1318563Sralph  *		>0  -  file number  -  ok
1418563Sralph  *		CF_DIAL,CF_NODEV  -  failed
1518563Sralph  */
1618563Sralph 
1718563Sralph df12popn (telno, flds, dev)
1818563Sralph char   *telno,
1918563Sralph        *flds[];
2018563Sralph struct Devices *dev;
2118563Sralph {
2218563Sralph     return df12opn (telno, flds, dev, 0);
2318563Sralph }
2418563Sralph 
2518563Sralph df12topn (telno, flds, dev)
2618563Sralph char   *telno,
2718563Sralph        *flds[];
2818563Sralph struct Devices *dev;
2918563Sralph {
3018563Sralph     return df12opn (telno, flds, dev, 1);
3118563Sralph }
3218563Sralph 
3318563Sralph /* ARGSUSED */
3418563Sralph df12opn (telno, flds, dev, toneflag)
3518563Sralph char   *telno;
3618563Sralph char   *flds[];
3718563Sralph struct Devices *dev;
3818563Sralph int     toneflag;
3918563Sralph {
4018563Sralph     int     phindex, dh = -1;
4118563Sralph     extern  errno;
4218563Sralph     char    dcname[20], newphone[64];
4318563Sralph 
4418563Sralph     sprintf (dcname, "/dev/%s", dev -> D_line);
4518563Sralph     DEBUG (4, "dc - %s\n", dcname);
4618563Sralph     if (setjmp (Sjbuf))
4718563Sralph     {
4818563Sralph 	logent (dcname, "TIMEOUT");
4918563Sralph 	if (dh >= 0)
5018563Sralph 	    close (dh);
5118563Sralph 	return CF_DIAL;
5218563Sralph     }
5318563Sralph     signal (SIGALRM, alarmtr);
5418563Sralph     getnextfd ();
5518563Sralph     alarm (10);
5618563Sralph     dh = open (dcname, 2);/* read/write */
5718563Sralph     alarm (0);
5818563Sralph 
5918563Sralph  /* modem is open */
6018563Sralph 
6118563Sralph  /* First, adjust our phone number string.  These modems don't
6218563Sralph   * like any characters but digits and "=" signs (for delay)
6318563Sralph   */
6418563Sralph     for (phindex = 0; *telno; telno++)
6518563Sralph     {
6618563Sralph 	if (*telno == '=' || (*telno >= '0' && *telno <= '9'))
6718563Sralph 	    newphone[phindex++] = *telno;
6818563Sralph 	if (phindex == 64)
6918563Sralph 	{
7018563Sralph 	    logent (dcname, "Phone number too long");
7118563Sralph 	    close (dh);
7218563Sralph 	    return CF_DIAL;
7318563Sralph 	}
7418563Sralph     }
7518563Sralph     newphone[phindex] = '\0';
7618563Sralph     next_fd = -1;
7718563Sralph     if (dh >= 0)
7818563Sralph     {
7918563Sralph 	fixline (dh, dev -> D_speed);
8018563Sralph 	if (dochat (dev, flds, dh))
8118563Sralph 	{
8218563Sralph 	    logent (dcname, "CHAT FAILED");
8318563Sralph 	    close (dh);
8418563Sralph 	    return CF_DIAL;
8518563Sralph 	}
8618563Sralph 	slowrite (dh, "\02");
8718563Sralph 	if (expect ("Ready\r\n", dh) != 0)
8818563Sralph 	{
8918563Sralph 	    DEBUG (4, "Didn't get 'Ready' response.\n", NULL);
9018563Sralph 	    logent (dcname, "Modem not responding");
9118563Sralph 	    close (dh);
9218563Sralph 	    return CF_DIAL;
9318563Sralph 	}
9418563Sralph 	DEBUG (4, "Got 'Ready' response\n", NULL);
9518563Sralph 	DEBUG (7, "Writing control select flag %c\n", toneflag ? 'T' : 'P');
9618563Sralph 	slowrite (dh, toneflag ? "T" : "P");
9718563Sralph 	DEBUG (4, "Writing telephone number %s\n", newphone);
9818563Sralph 	slowrite (dh, newphone);
9918563Sralph 	DEBUG (7, "Telephone number written\n", NULL);
10018563Sralph 	slowrite (dh, "#");
10118563Sralph 	DEBUG (7, "Writing # sign\n", NULL);
10218563Sralph 
10318563Sralph 	if (expect ("Attached\r\n", dh) != 0)
10418563Sralph 	{
10518563Sralph 	    logent (dcname, "No carrier");
10618563Sralph 	    strcpy (devSel, dev -> D_line);
10718563Sralph 	    df12cls (dh);
10818563Sralph 	    return CF_DIAL;
10918563Sralph 	}
11018563Sralph 
11118563Sralph     }
11218563Sralph     if (dh < 0)
11318563Sralph     {
11418563Sralph 	logent (dcname, "CAN'T OPEN");
11518563Sralph 	return CF_NODEV;
11618563Sralph     }
11718563Sralph     else
11818563Sralph     {
11918563Sralph 	DEBUG (4, "df12 ok\n", CNULL);
12018563Sralph 	return dh;
12118563Sralph     }
12218563Sralph }
12318563Sralph 
12418563Sralph df12cls (fd)
12518563Sralph int     fd;
12618563Sralph {
12718563Sralph     char    dcname[20];
12818563Sralph     struct sgttyb   hup,
12918563Sralph                     sav;
13018563Sralph 
13118563Sralph     if (fd > 0)
13218563Sralph     {
13318563Sralph 	sprintf (dcname, "/dev/%s", devSel);
13418563Sralph 	DEBUG (4, "Hanging up fd = %d\n", fd);
13518563Sralph     /*
13618563Sralph      * code to drop DTR -- change to 0 baud then back to default.
13718563Sralph      */
13818563Sralph 	gtty (fd, &hup);
13918563Sralph 	gtty (fd, &sav);
14018563Sralph 	hup.sg_ispeed = B0;
14118563Sralph 	hup.sg_ospeed = B0;
14218563Sralph 	stty (fd, &hup);
14318563Sralph 	sleep (2);
14418563Sralph 	stty (fd, &sav);
14518563Sralph     /*
14618563Sralph      * now raise DTR -- close the device & open it again.
14718563Sralph      */
14818563Sralph 	sleep (2);
14918563Sralph 	close (fd);
15018563Sralph 	sleep (2);
15118563Sralph 	delock (devSel);
15218563Sralph     }
15318563Sralph }
154