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 817773Sralph #ifndef lint 9*48651Sbostic static char sccsid[] = "@(#)dn.c 4.5 (Berkeley) 04/24/91"; 10*48651Sbostic #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 */ 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 */ 14117773Sralph dncls(fd) 14217773Sralph register int fd; 14317773Sralph { 14417773Sralph if (fd > 0) { 14517773Sralph close(fd); 14617773Sralph sleep(5); 14717773Sralph delock(devSel); 14817773Sralph } 14917773Sralph } 150