1 /* acu.c 4.7 82/07/29 */ 2 #include "tip.h" 3 #include <setjmp.h> 4 5 static acu_t *acu = NOACU; 6 static int conflag; 7 static int acuabort(); 8 static acu_t *acutype(); 9 static jmp_buf jmpbuf; 10 /* 11 * Establish connection for tip 12 * 13 * If DU is true, we should dial an ACU whose type is AT. 14 * The phone numbers are in PN, and the call unit is in CU. 15 * 16 * If the PN is an '@', then we consult the PHONES file for 17 * the phone numbers. This file is /etc/phones, unless overriden 18 * by an exported shell variable. 19 * 20 * The data base files must be in the format: 21 * host-name[ \t]*phone-number 22 * with the possibility of multiple phone numbers 23 * for a single host acting as a rotary (in the order 24 * found in the file). 25 */ 26 char * 27 connect() 28 { 29 register char *cp = PN; 30 char *phnum, string[256]; 31 FILE *fd; 32 int tried = 0; 33 34 if (!DU) { /* regular connect message */ 35 if (CM != NOSTR) 36 write(FD, cp, size(CM)); 37 return (NOSTR); 38 } 39 /* 40 * @ =>'s use data base in PHONES environment variable 41 * otherwise, use /etc/phones 42 */ 43 signal(SIGINT, acuabort); 44 signal(SIGQUIT, acuabort); 45 if (setjmp(jmpbuf)) { 46 signal(SIGINT, SIG_IGN); 47 signal(SIGQUIT, SIG_IGN); 48 printf("\ncall aborted\n"); 49 logent(value(HOST), "", "", "call aborted"); 50 if (acu != NOACU) { 51 boolean(value(VERBOSE)) = FALSE; 52 if (conflag) 53 disconnect(); 54 else 55 (*acu->acu_abort)(); 56 } 57 delock(uucplock); 58 exit(1); 59 } 60 if ((acu = acutype(AT)) == NOACU) 61 return ("unknown ACU type"); 62 if (*cp != '@') { 63 while (*cp) { 64 for (phnum = cp; any(*cp, "0123456789-*=&%"); cp++) 65 ; 66 if (*cp) 67 *cp++ = '\0'; 68 69 if (conflag = (*acu->acu_dialer)(phnum, CU)) { 70 logent(value(HOST), phnum, acu->acu_name, 71 "call completed"); 72 return (NOSTR); 73 } else 74 logent(value(HOST), phnum, acu->acu_name, 75 "no answer"); 76 tried++; 77 } 78 } else { 79 if ((fd = fopen(PH, "r")) == NOFILE) { 80 printf("%s: ", PH); 81 return ("can't open phone number file"); 82 } 83 while (fgets(string, sizeof(string), fd) != NOSTR) { 84 for (cp = string; !any(*cp, " \t\n"); cp++) 85 ; 86 if (*cp == '\n') { 87 fclose(fd); 88 return ("unrecognizable host name"); 89 } 90 *cp++ = '\0'; 91 if (strcmp(string, value(HOST))) 92 continue; 93 while (any(*cp, " \t")) 94 cp++; 95 if (*cp == '\n') { 96 fclose(fd); 97 return ("missing phone number"); 98 } 99 for (phnum = cp; any(*cp, "0123456789-*=&%"); cp++) 100 ; 101 *cp = '\0'; 102 103 if (conflag = (*acu->acu_dialer)(phnum, CU)) { 104 fclose(fd); 105 logent(value(HOST), phnum, acu->acu_name, 106 "call completed"); 107 return (NOSTR); 108 } else 109 logent(value(HOST), phnum, acu->acu_name, 110 "no answer"); 111 tried++; 112 } 113 fclose(fd); 114 } 115 if (!tried) 116 logent(value(HOST), "", acu->acu_name, "missing phone number"); 117 return (tried ? "no answer" : "missing phone number"); 118 } 119 120 disconnect() 121 { 122 if (!conflag) 123 return; 124 logent(value(HOST), "", acu->acu_name, "call terminated"); 125 if (boolean(value(VERBOSE))) 126 printf("\r\ndisconnecting..."); 127 (*acu->acu_disconnect)(); 128 } 129 130 static int 131 acuabort(s) 132 { 133 signal(s, SIG_IGN); 134 longjmp(jmpbuf, 1); 135 } 136 137 static acu_t * 138 acutype(s) 139 register char *s; 140 { 141 register acu_t *p; 142 extern acu_t acutable[]; 143 144 for (p = acutable; p->acu_name != '\0'; p++) 145 if (!strcmp(s, p->acu_name)) 146 return (p); 147 return (NOACU); 148 } 149