1*3909Ssam /* dn11.c 4.5 81/06/21 */ 23897Ssam 33897Ssam #if DN11 43691Sroot /* 53691Sroot * Routines for dialing up on DN-11 63691Sroot */ 73691Sroot #include "tip.h" 83897Ssam #include <setjmp.h> 93897Ssam #include <errno.h> 103691Sroot 113691Sroot int dn_abort(); 123691Sroot 133897Ssam int alarmtr(); 143897Ssam 153897Ssam static jmp_buf jmpbuf; 16*3909Ssam static int child = -1, dn; 173897Ssam 183691Sroot dn_dialer(num, acu) 193691Sroot char *num, *acu; 203691Sroot { 213691Sroot extern errno; 223897Ssam char *p, *q, phone[40]; 23*3909Ssam int lt, nw, connected = 1; 243897Ssam register int timelim; 253691Sroot 263901Ssam if (boolean(value(VERBOSE))) 273901Ssam printf("\nstarting call..."); 283691Sroot if ((dn = open(acu, 1)) < 0) { 293897Ssam if (errno == ENXIO) 303901Ssam printf("line busy..."); 313897Ssam else 323901Ssam printf("acu open error..."); 333691Sroot return(0); 343691Sroot } 353897Ssam if (setjmp(jmpbuf)) { 363897Ssam kill(child, SIGKILL); 373897Ssam close(dn); 383691Sroot return(0); 393691Sroot } 403897Ssam signal(SIGALRM, alarmtr); 413897Ssam timelim = 5 * strlen(num); 423897Ssam alarm(timelim < 30 ? 30 : timelim); 433897Ssam if ((child = fork()) == 0) { 443901Ssam /* 453901Ssam * ignore this stuff for aborts 463901Ssam */ 473691Sroot signal(SIGALRM, SIG_IGN); 483901Ssam signal(SIGINT, SIG_IGN); 493901Ssam signal(SIGQUIT, SIG_IGN); 503897Ssam sleep(2); 513897Ssam nw = write(dn, num, lt = strlen(num)); 523897Ssam if (nw != lt) { 533897Ssam printf("dn11 write failed..."); 543897Ssam exit(1); 553897Ssam } 563897Ssam exit(0); 573691Sroot } 583901Ssam /* 593901Ssam * open line - will return on carrier 603901Ssam */ 613691Sroot FD = open(DV, 2); 623691Sroot if (FD < 0) { 633897Ssam if (errno == EIO) 643897Ssam printf("lost carrier..."); 653897Ssam else 663897Ssam printf("dialup line open failed..."); 673897Ssam alarm(0); 683897Ssam kill(child, SIGKILL); 693897Ssam close(dn); 703897Ssam return(0); 713691Sroot } 723897Ssam ioctl(dn, TIOCHPCL, 0); 733897Ssam signal(SIGALRM, SIG_DFL); 743897Ssam while ((nw = wait(<)) != child && nw != -1) 753691Sroot ; 763691Sroot alarm(0); 773897Ssam fflush(stdout); 783897Ssam if (lt != 0) { 793897Ssam close(FD); 803897Ssam close(dn); 813897Ssam return(0); 823897Ssam } 833897Ssam return(1); 843691Sroot } 853691Sroot 863897Ssam alarmtr() 873897Ssam { 883897Ssam alarm(0); 893897Ssam signal(SIGINT, SIG_IGN); 903897Ssam signal(SIGQUIT, SIG_IGN); 913897Ssam longjmp(jmpbuf, 1); 923897Ssam } 933691Sroot 943897Ssam /* 953897Ssam * Insurance, for some reason we don't seem to be 963897Ssam * hanging up... 973897Ssam */ 983897Ssam dn_disconnect() 993897Ssam { 1003901Ssam sleep(2); 1013897Ssam #ifdef VMUNIX 1023897Ssam if (FD > 0) 1033897Ssam ioctl(FD, TIOCCDTR, 0); 1043691Sroot #endif 1053897Ssam close(FD); 1063897Ssam } 1073897Ssam 1083897Ssam dn_abort() 1093897Ssam { 1103901Ssam sleep(2); 111*3909Ssam if (child > 0) 112*3909Ssam kill(child, SIGKILL); 113*3909Ssam if (dn > 0) 114*3909Ssam close(dn); 1153897Ssam #ifdef VMUNIX 1163897Ssam if (FD > 0) 1173897Ssam ioctl(FD, TIOCCDTR, 0); 1183897Ssam #endif 1193897Ssam close(FD); 1203897Ssam } 1213897Ssam #endif 122