|
|
1.1 ! root 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.5 (Berkeley) 12/4/87"; ! 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: logent(value(HOST), "", DV, "call completed"); ! 46: return (NOSTR); ! 47: } ! 48: /* ! 49: * @ =>'s use data base in PHONES environment variable ! 50: * otherwise, use /etc/phones ! 51: */ ! 52: signal(SIGINT, acuabort); ! 53: signal(SIGQUIT, acuabort); ! 54: if (setjmp(jmpbuf)) { ! 55: signal(SIGINT, SIG_IGN); ! 56: signal(SIGQUIT, SIG_IGN); ! 57: printf("\ncall aborted\n"); ! 58: logent(value(HOST), "", "", "call aborted"); ! 59: if (acu != NOACU) { ! 60: boolean(value(VERBOSE)) = FALSE; ! 61: if (conflag) ! 62: disconnect(NOSTR); ! 63: else ! 64: (*acu->acu_abort)(); ! 65: } ! 66: return ("interrupt"); ! 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: logent(value(HOST), "", DV, "call terminated"); ! 136: return; ! 137: } ! 138: if (reason == NOSTR) { ! 139: logent(value(HOST), "", acu->acu_name, "call terminated"); ! 140: if (boolean(value(VERBOSE))) ! 141: printf("\r\ndisconnecting..."); ! 142: } else ! 143: logent(value(HOST), "", acu->acu_name, reason); ! 144: (*acu->acu_disconnect)(); ! 145: } ! 146: ! 147: static int ! 148: acuabort(s) ! 149: { ! 150: signal(s, SIG_IGN); ! 151: longjmp(jmpbuf, 1); ! 152: } ! 153: ! 154: static acu_t * ! 155: acutype(s) ! 156: register char *s; ! 157: { ! 158: register acu_t *p; ! 159: extern acu_t acutable[]; ! 160: ! 161: for (p = acutable; p->acu_name != '\0'; p++) ! 162: if (!strcmp(s, p->acu_name)) ! 163: return (p); ! 164: return (NOACU); ! 165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.