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