148651Sbostic /*-
2*62384Sbostic * Copyright (c) 1985, 1993
3*62384Sbostic * The Regents of the University of California. All rights reserved.
448651Sbostic *
548651Sbostic * %sccs.include.proprietary.c%
648651Sbostic */
748651Sbostic
817771Sralph #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)df2.c 8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1117771Sralph
1246875Sbostic #include "condevs.h"
1317771Sralph
1417771Sralph /*
1517771Sralph * df2opn(ph, flds, dev) dial remote machine
1617771Sralph *
1717771Sralph * return codes:
1817771Sralph * file descriptor - succeeded
1917771Sralph * FAIL - failed
2017771Sralph */
df2opn(ph,flds,dev)2117771Sralph df2opn(ph, flds, dev)
2217771Sralph char *ph;
2317771Sralph char *flds[];
2417771Sralph struct Devices *dev;
2517771Sralph {
2617771Sralph char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
2723696Sbloom #ifdef USG
2817771Sralph struct termio ttbuf;
2923696Sbloom #endif USG
3017771Sralph int dcf, dnf;
3117771Sralph int nw, lt, pid, st, status;
3217771Sralph unsigned timelim;
3323696Sbloom #ifdef TIOCFLUSH
3423696Sbloom int zero = 0;
3523696Sbloom #endif TIOCFLUSH
3617771Sralph
3717771Sralph sprintf(dnname, "/dev/%s", dev->D_calldev);
3817771Sralph if (setjmp(Sjbuf)) {
3917771Sralph logent(dnname, "CAN'T OPEN");
4017771Sralph DEBUG(4, "%s Open timed out\n", dnname);
4117771Sralph return CF_NODEV;
4217771Sralph }
4317771Sralph signal(SIGALRM, alarmtr);
4417771Sralph getnextfd();
4517771Sralph errno = 0;
4617771Sralph alarm(10);
4717771Sralph dnf = open(dnname, 2 );
4817771Sralph alarm(0);
4917771Sralph next_fd = -1;
5017771Sralph if (dnf < 0 && errno == EACCES) {
5117771Sralph logent(dnname, "CAN'T OPEN");
5217771Sralph delock(dev->D_line);
5317771Sralph logent("DEVICE", "NO");
5417771Sralph return CF_NODEV;
5517771Sralph }
5617771Sralph fioclex(dnf);
5717771Sralph
5817771Sralph sprintf(dcname, "/dev/%s", dev->D_line);
5917771Sralph fixline(dnf, dev->D_speed);
6017771Sralph sprintf(phone, "\02%s", ph);
6117771Sralph DEBUG(4, "dc - %s, ", dcname);
6217771Sralph DEBUG(4, "acu - %s\n", dnname);
6317771Sralph pid = 0;
6417771Sralph if (setjmp(Sjbuf)) {
6517771Sralph logent("DIALUP DN write", "TIMEOUT");
6617771Sralph if (pid)
6717771Sralph kill(pid, 9);
6817771Sralph delock(dev->D_line);
6917771Sralph if (dnf)
7017771Sralph close(dnf);
7117771Sralph return CF_DIAL;
7217771Sralph }
7317771Sralph signal(SIGALRM, alarmtr);
7417771Sralph timelim = 5 * strlen(phone);
7517771Sralph alarm(timelim < 30 ? 30 : timelim);
7617771Sralph if ((pid = fork()) == 0) {
7717771Sralph sleep(2);
7817771Sralph fclose(stdin);
7917771Sralph fclose(stdout);
8017771Sralph #ifdef TIOCFLUSH
8123696Sbloom ioctl(dnf, TIOCFLUSH, &zero);
8217771Sralph #endif TIOCFLUSH
8317771Sralph write(dnf, "\01", 1);
8417771Sralph sleep(1);
8517771Sralph nw = write(dnf, phone, lt = strlen(phone));
8617771Sralph if (nw != lt) {
8717771Sralph logent("DIALUP ACU write", _FAILED);
8817771Sralph exit(1);
8917771Sralph }
9017771Sralph DEBUG(4, "ACU write ok%s\n", CNULL);
9117771Sralph exit(0);
9217771Sralph }
9317771Sralph /* open line - will return on carrier */
9417771Sralph /* RT needs a sleep here because it returns immediately from open */
9517771Sralph
9617771Sralph #if RT
9717771Sralph sleep(15);
9817771Sralph #endif
9917771Sralph
10017771Sralph if (read(dnf, &c, 1) != 1 || c != 'A')
10117771Sralph dcf = -1;
10217771Sralph else
10317771Sralph dcf = 0;
10417771Sralph DEBUG(4, "dcf is %d\n", dcf);
10517771Sralph if (dcf < 0) {
10617771Sralph logent("DIALUP LINE open", _FAILED);
10717771Sralph alarm(0);
10817771Sralph kill(pid, 9);
10917771Sralph close(dnf);
11017771Sralph delock(dev->D_line);
11117771Sralph return CF_DIAL;
11217771Sralph }
11317771Sralph dcf = dnf;
11417771Sralph dnf = 0;
11517771Sralph while ((nw = wait(<)) != pid && nw != -1)
11617771Sralph ;
11723696Sbloom #ifdef USG
11817771Sralph ioctl(dcf, TCGETA, &ttbuf);
11917771Sralph if(!(ttbuf.c_cflag & HUPCL)) {
12017771Sralph ttbuf.c_cflag |= HUPCL;
12117771Sralph ioctl(dcf, TCSETA, &ttbuf);
12217771Sralph }
12323696Sbloom #endif USG
12417771Sralph alarm(0);
12517771Sralph fflush(stdout);
12617771Sralph fixline(dcf, dev->D_speed);
12717771Sralph DEBUG(4, "Fork Stat %o\n", lt);
12817771Sralph if (lt != 0) {
12917771Sralph close(dcf);
13017771Sralph if (dnf)
13117771Sralph close(dnf);
13217771Sralph delock(dev->D_line);
13317771Sralph return CF_DIAL;
13417771Sralph }
13517771Sralph return dcf;
13617771Sralph }
13717771Sralph
13817771Sralph /*
13917771Sralph * df2cls() close the DF02/DF03 call unit
14017771Sralph *
14117771Sralph * return codes: none
14217771Sralph */
df2cls(fd)14317771Sralph df2cls(fd)
14417771Sralph register int fd;
14517771Sralph {
14617771Sralph if (fd > 0) {
14717771Sralph close(fd);
14817771Sralph sleep(5);
14917771Sralph delock(devSel);
15017771Sralph }
15117771Sralph }
152