1*48651Sbostic /*- 2*48651Sbostic * Copyright (c) 1985 The Regents of the University of California. 3*48651Sbostic * All rights reserved. 4*48651Sbostic * 5*48651Sbostic * %sccs.include.proprietary.c% 6*48651Sbostic */ 7*48651Sbostic 817771Sralph #ifndef lint 9*48651Sbostic static char sccsid[] = "@(#)df2.c 4.5 (Berkeley) 04/24/91"; 10*48651Sbostic #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 */ 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 */ 14317771Sralph df2cls(fd) 14417771Sralph register int fd; 14517771Sralph { 14617771Sralph if (fd > 0) { 14717771Sralph close(fd); 14817771Sralph sleep(5); 14917771Sralph delock(devSel); 15017771Sralph } 15117771Sralph } 152