1 #ifndef lint 2 static char sccsid[] = "@(#)dn11.c 4.14 (Berkeley) 06/25/83"; 3 #endif 4 5 /* 6 * Routines for dialing up on DN-11 7 */ 8 #include "tip.h" 9 10 int dn_abort(), alarmtr(); 11 static jmp_buf jmpbuf; 12 static int child = -1, dn; 13 14 dn_dialer(num, acu) 15 char *num, *acu; 16 { 17 extern errno; 18 char *p, *q, phone[40]; 19 int lt, nw, connected = 1; 20 register int timelim; 21 22 if (boolean(value(VERBOSE))) 23 printf("\nstarting call..."); 24 if ((dn = open(acu, 1)) < 0) { 25 if (errno == EBUSY) 26 printf("line busy..."); 27 else 28 printf("acu open error..."); 29 return (0); 30 } 31 if (setjmp(jmpbuf)) { 32 kill(child, SIGKILL); 33 close(dn); 34 return (0); 35 } 36 signal(SIGALRM, alarmtr); 37 timelim = 5 * strlen(num); 38 alarm(timelim < 30 ? 30 : timelim); 39 if ((child = fork()) == 0) { 40 /* 41 * ignore this stuff for aborts 42 */ 43 signal(SIGALRM, SIG_IGN); 44 signal(SIGINT, SIG_IGN); 45 signal(SIGQUIT, SIG_IGN); 46 sleep(2); 47 nw = write(dn, num, lt = strlen(num)); 48 exit(nw != lt); 49 } 50 /* 51 * open line - will return on carrier 52 */ 53 if ((FD = open(DV, 2)) < 0) { 54 if (errno == EIO) 55 printf("lost carrier..."); 56 else 57 printf("dialup line open failed..."); 58 alarm(0); 59 kill(child, SIGKILL); 60 close(dn); 61 return (0); 62 } 63 alarm(0); 64 ioctl(dn, TIOCHPCL, 0); 65 signal(SIGALRM, SIG_DFL); 66 while ((nw = wait(<)) != child && nw != -1) 67 ; 68 fflush(stdout); 69 close(dn); 70 if (lt != 0) { 71 close(FD); 72 return (0); 73 } 74 return (1); 75 } 76 77 alarmtr() 78 { 79 80 alarm(0); 81 longjmp(jmpbuf, 1); 82 } 83 84 /* 85 * Insurance, for some reason we don't seem to be 86 * hanging up... 87 */ 88 dn_disconnect() 89 { 90 91 sleep(2); 92 if (FD > 0) 93 ioctl(FD, TIOCCDTR, 0); 94 close(FD); 95 } 96 97 dn_abort() 98 { 99 100 sleep(2); 101 if (child > 0) 102 kill(child, SIGKILL); 103 if (dn > 0) 104 close(dn); 105 if (FD > 0) 106 ioctl(FD, TIOCCDTR, 0); 107 close(FD); 108 } 109