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
817773Sralph #ifndef lint
9*62384Sbostic static char sccsid[] = "@(#)dn.c 8.1 (Berkeley) 06/06/93";
1048651Sbostic #endif /* not lint */
1117773Sralph
1246875Sbostic #include "condevs.h"
1323697Sbloom #define ACULAST "-<"
1417773Sralph
1517773Sralph /***
1617773Sralph * dnopn(ph, flds, dev) dial remote machine
1717773Sralph *
1817773Sralph * return codes:
1917773Sralph * file descriptor - succeeded
2017773Sralph * FAIL - failed
2117773Sralph */
dnopn(ph,flds,dev)2217773Sralph dnopn(ph, flds, dev)
2317773Sralph char *ph;
2417773Sralph char *flds[];
2517773Sralph struct Devices *dev;
2617773Sralph {
2717773Sralph char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
2823697Sbloom #ifdef USG
2917773Sralph struct termio ttbuf;
3023697Sbloom #endif USG
3117773Sralph int dnf, dcf;
3217773Sralph int nw, lt, pid, status;
3317773Sralph unsigned timelim;
3423697Sbloom #ifdef TIOCFLUSH
3523697Sbloom int zero = 0;
3623697Sbloom #endif TIOCFLUSH
3717773Sralph
3817773Sralph sprintf(dnname, "/dev/%s", dev->D_calldev);
3917773Sralph errno = 0;
4017773Sralph
4117773Sralph if (setjmp(Sjbuf)) {
4217773Sralph logent(dnname, "CAN'T OPEN");
4317773Sralph DEBUG(4, "%s Open timed out\n", dnname);
4417773Sralph return(CF_NODEV);
4517773Sralph }
4617773Sralph signal(SIGALRM, alarmtr);
4717773Sralph getnextfd();
4817773Sralph alarm(10);
4917773Sralph dnf = open(dnname, 1);
5017773Sralph alarm(0);
5117773Sralph next_fd = -1;
5217773Sralph if (dnf < 0 && errno == EACCES) {
5317773Sralph logent(dnname, "CAN'T OPEN");
5417773Sralph logent("DEVICE", "NO");
5517773Sralph return CF_NODEV;
5617773Sralph }
5717773Sralph fioclex(dnf);
5817773Sralph
5917773Sralph sprintf(dcname, "/dev/%s", dev->D_line);
6017773Sralph sprintf(phone, "%s%s", ph, ACULAST);
6117773Sralph DEBUG(4, "dc - %s, ", dcname);
6217773Sralph DEBUG(4, "acu - %s\n", dnname);
6317773Sralph pid = 0;
6417773Sralph if (setjmp(Sjbuf)) {
6517773Sralph logent("DIALUP DN write", "TIMEOUT");
6617773Sralph if (pid)
6717773Sralph kill(pid, 9);
6817773Sralph delock(dev->D_line);
6917773Sralph if (dnf)
7017773Sralph close(dnf);
7117773Sralph return CF_DIAL;
7217773Sralph }
7317773Sralph signal(SIGALRM, alarmtr);
7417773Sralph timelim = 5 * strlen(phone);
7517773Sralph alarm(timelim < 30 ? 30 : timelim);
7617773Sralph if ((pid = fork()) == 0) {
7717773Sralph sleep(2);
7817773Sralph fclose(stdin);
7917773Sralph fclose(stdout);
8017773Sralph #ifdef TIOCFLUSH
8123697Sbloom ioctl(dnf, TIOCFLUSH, &zero);
8223697Sbloom #endif TIOCFLUSH
8317773Sralph nw = write(dnf, phone, lt = strlen(phone));
8417773Sralph if (nw != lt) {
8517773Sralph logent("DIALUP ACU write", _FAILED);
8617773Sralph exit(1);
8717773Sralph }
8817773Sralph DEBUG(4, "ACU write ok\n", CNULL);
8917773Sralph exit(0);
9017773Sralph }
9117773Sralph /* open line - will return on carrier */
9217773Sralph /* RT needs a sleep here because it returns immediately from open */
9317773Sralph
9417773Sralph #if RT
9517773Sralph sleep(15);
9617773Sralph #endif
9717773Sralph
9817773Sralph getnextfd();
9917773Sralph errno = 0;
10017773Sralph dcf = open(dcname, 2);
10117773Sralph next_fd = -1;
10217773Sralph if (dcf < 0 && errno == EACCES)
10317773Sralph logent(dcname, "CAN'T OPEN");
10417773Sralph DEBUG(4, "dcf is %d\n", dcf);
10517773Sralph if (dcf < 0) {
10617773Sralph logent("DIALUP LINE open", _FAILED);
10717773Sralph alarm(0);
10817773Sralph kill(pid, 9);
10917773Sralph close(dnf);
11017773Sralph delock(dev->D_line);
11117773Sralph return CF_DIAL;
11217773Sralph }
11317773Sralph while ((nw = wait(<)) != pid && nw != -1)
11417773Sralph ;
11523697Sbloom #ifdef USG
11617773Sralph ioctl(dcf, TCGETA, &ttbuf);
11717773Sralph if(!(ttbuf.c_cflag & HUPCL)) {
11817773Sralph ttbuf.c_cflag |= HUPCL;
11917773Sralph ioctl(dcf, TCSETA, &ttbuf);
12017773Sralph }
12123697Sbloom #endif USG
12217773Sralph alarm(0);
12317773Sralph fflush(stdout);
12417773Sralph fixline(dcf, dev->D_speed);
12517773Sralph DEBUG(4, "Fork Stat %o\n", lt);
12617773Sralph if (lt != 0) {
12717773Sralph close(dcf);
12817773Sralph if (dnf)
12917773Sralph close(dnf);
13017773Sralph delock(dev->D_line);
13117773Sralph return CF_DIAL;
13217773Sralph }
13317773Sralph return dcf;
13417773Sralph }
13517773Sralph
13617773Sralph /***
13717773Sralph * dncls() close dn type call unit
13817773Sralph *
13917773Sralph * return codes: None
14017773Sralph */
dncls(fd)14117773Sralph dncls(fd)
14217773Sralph register int fd;
14317773Sralph {
14417773Sralph if (fd > 0) {
14517773Sralph close(fd);
14617773Sralph sleep(5);
14717773Sralph delock(devSel);
14817773Sralph }
14917773Sralph }
150