1 #ifndef lint 2 static char sccsid[] = "@(#)df2.c 4.4 (Berkeley) 03/02/91"; 3 #endif 4 5 #include "condevs.h" 6 7 /* 8 * df2opn(ph, flds, dev) dial remote machine 9 * 10 * return codes: 11 * file descriptor - succeeded 12 * FAIL - failed 13 */ 14 df2opn(ph, flds, dev) 15 char *ph; 16 char *flds[]; 17 struct Devices *dev; 18 { 19 char dcname[20], dnname[20], phone[MAXPH+2], c = 0; 20 #ifdef USG 21 struct termio ttbuf; 22 #endif USG 23 int dcf, dnf; 24 int nw, lt, pid, st, status; 25 unsigned timelim; 26 #ifdef TIOCFLUSH 27 int zero = 0; 28 #endif TIOCFLUSH 29 30 sprintf(dnname, "/dev/%s", dev->D_calldev); 31 if (setjmp(Sjbuf)) { 32 logent(dnname, "CAN'T OPEN"); 33 DEBUG(4, "%s Open timed out\n", dnname); 34 return CF_NODEV; 35 } 36 signal(SIGALRM, alarmtr); 37 getnextfd(); 38 errno = 0; 39 alarm(10); 40 dnf = open(dnname, 2 ); 41 alarm(0); 42 next_fd = -1; 43 if (dnf < 0 && errno == EACCES) { 44 logent(dnname, "CAN'T OPEN"); 45 delock(dev->D_line); 46 logent("DEVICE", "NO"); 47 return CF_NODEV; 48 } 49 fioclex(dnf); 50 51 sprintf(dcname, "/dev/%s", dev->D_line); 52 fixline(dnf, dev->D_speed); 53 sprintf(phone, "\02%s", ph); 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 write(dnf, "\01", 1); 77 sleep(1); 78 nw = write(dnf, phone, lt = strlen(phone)); 79 if (nw != lt) { 80 logent("DIALUP ACU write", _FAILED); 81 exit(1); 82 } 83 DEBUG(4, "ACU write ok%s\n", CNULL); 84 exit(0); 85 } 86 /* open line - will return on carrier */ 87 /* RT needs a sleep here because it returns immediately from open */ 88 89 #if RT 90 sleep(15); 91 #endif 92 93 if (read(dnf, &c, 1) != 1 || c != 'A') 94 dcf = -1; 95 else 96 dcf = 0; 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 dcf = dnf; 107 dnf = 0; 108 while ((nw = wait(<)) != pid && nw != -1) 109 ; 110 #ifdef USG 111 ioctl(dcf, TCGETA, &ttbuf); 112 if(!(ttbuf.c_cflag & HUPCL)) { 113 ttbuf.c_cflag |= HUPCL; 114 ioctl(dcf, TCSETA, &ttbuf); 115 } 116 #endif USG 117 alarm(0); 118 fflush(stdout); 119 fixline(dcf, dev->D_speed); 120 DEBUG(4, "Fork Stat %o\n", lt); 121 if (lt != 0) { 122 close(dcf); 123 if (dnf) 124 close(dnf); 125 delock(dev->D_line); 126 return CF_DIAL; 127 } 128 return dcf; 129 } 130 131 /* 132 * df2cls() close the DF02/DF03 call unit 133 * 134 * return codes: none 135 */ 136 df2cls(fd) 137 register int fd; 138 { 139 if (fd > 0) { 140 close(fd); 141 sleep(5); 142 delock(devSel); 143 } 144 } 145