1 #ifndef lint 2 static char sccsid[] = "@(#)dn.c 4.3 (Berkeley) 02/24/88"; 3 #endif 4 5 #include "../condevs.h" 6 #define ACULAST "-<" 7 8 /*** 9 * dnopn(ph, flds, dev) dial remote machine 10 * 11 * return codes: 12 * file descriptor - succeeded 13 * FAIL - failed 14 */ 15 dnopn(ph, flds, dev) 16 char *ph; 17 char *flds[]; 18 struct Devices *dev; 19 { 20 char dcname[20], dnname[20], phone[MAXPH+2], c = 0; 21 #ifdef USG 22 struct termio ttbuf; 23 #endif USG 24 int dnf, dcf; 25 int nw, lt, pid, status; 26 unsigned timelim; 27 #ifdef TIOCFLUSH 28 int zero = 0; 29 #endif TIOCFLUSH 30 31 sprintf(dnname, "/dev/%s", dev->D_calldev); 32 errno = 0; 33 34 if (setjmp(Sjbuf)) { 35 logent(dnname, "CAN'T OPEN"); 36 DEBUG(4, "%s Open timed out\n", dnname); 37 return(CF_NODEV); 38 } 39 signal(SIGALRM, alarmtr); 40 getnextfd(); 41 alarm(10); 42 dnf = open(dnname, 1); 43 alarm(0); 44 next_fd = -1; 45 if (dnf < 0 && errno == EACCES) { 46 logent(dnname, "CAN'T OPEN"); 47 logent("DEVICE", "NO"); 48 return CF_NODEV; 49 } 50 fioclex(dnf); 51 52 sprintf(dcname, "/dev/%s", dev->D_line); 53 sprintf(phone, "%s%s", ph, ACULAST); 54 DEBUG(4, "dc - %s, ", dcname); 55 DEBUG(4, "acu - %s\n", dnname); 56 pid = 0; 57 if (setjmp(Sjbuf)) { 58 logent("DIALUP DN write", "TIMEOUT"); 59 if (pid) 60 kill(pid, 9); 61 delock(dev->D_line); 62 if (dnf) 63 close(dnf); 64 return CF_DIAL; 65 } 66 signal(SIGALRM, alarmtr); 67 timelim = 5 * strlen(phone); 68 alarm(timelim < 30 ? 30 : timelim); 69 if ((pid = fork()) == 0) { 70 sleep(2); 71 fclose(stdin); 72 fclose(stdout); 73 #ifdef TIOCFLUSH 74 ioctl(dnf, TIOCFLUSH, &zero); 75 #endif TIOCFLUSH 76 nw = write(dnf, phone, lt = strlen(phone)); 77 if (nw != lt) { 78 logent("DIALUP ACU write", _FAILED); 79 exit(1); 80 } 81 DEBUG(4, "ACU write ok\n", CNULL); 82 exit(0); 83 } 84 /* open line - will return on carrier */ 85 /* RT needs a sleep here because it returns immediately from open */ 86 87 #if RT 88 sleep(15); 89 #endif 90 91 getnextfd(); 92 errno = 0; 93 dcf = open(dcname, 2); 94 next_fd = -1; 95 if (dcf < 0 && errno == EACCES) 96 logent(dcname, "CAN'T OPEN"); 97 DEBUG(4, "dcf is %d\n", dcf); 98 if (dcf < 0) { 99 logent("DIALUP LINE open", _FAILED); 100 alarm(0); 101 kill(pid, 9); 102 close(dnf); 103 delock(dev->D_line); 104 return CF_DIAL; 105 } 106 while ((nw = wait(<)) != pid && nw != -1) 107 ; 108 #ifdef USG 109 ioctl(dcf, TCGETA, &ttbuf); 110 if(!(ttbuf.c_cflag & HUPCL)) { 111 ttbuf.c_cflag |= HUPCL; 112 ioctl(dcf, TCSETA, &ttbuf); 113 } 114 #endif USG 115 alarm(0); 116 fflush(stdout); 117 fixline(dcf, dev->D_speed); 118 DEBUG(4, "Fork Stat %o\n", lt); 119 if (lt != 0) { 120 close(dcf); 121 if (dnf) 122 close(dnf); 123 delock(dev->D_line); 124 return CF_DIAL; 125 } 126 return dcf; 127 } 128 129 /*** 130 * dncls() close dn type call unit 131 * 132 * return codes: None 133 */ 134 dncls(fd) 135 register int fd; 136 { 137 if (fd > 0) { 138 close(fd); 139 sleep(5); 140 delock(devSel); 141 } 142 } 143