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[] = "@(#)remote.c 5.3 (Berkeley) 04/30/86"; 9 #endif not lint 10 11 # include "tip.h" 12 13 /* 14 * Attributes to be gleened from remote host description 15 * data base. 16 */ 17 static char **caps[] = { 18 &AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI, 19 &ES, &EX, &FO, &RC, &RE, &PA 20 }; 21 22 static char *capstrings[] = { 23 "at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr", 24 "di", "es", "ex", "fo", "rc", "re", "pa", 0 25 }; 26 27 char *rgetstr(); 28 29 static 30 getremcap(host) 31 register char *host; 32 { 33 int stat; 34 char tbuf[BUFSIZ]; 35 static char buf[BUFSIZ/2]; 36 char *bp = buf; 37 register char **p, ***q; 38 39 if ((stat = rgetent(tbuf, host)) <= 0) { 40 if (DV || 41 host[0] == '/' && access(DV = host, R_OK | W_OK) == 0) { 42 CU = DV; 43 HO = host; 44 HW = 1; 45 DU = 0; 46 if (!BR) 47 BR = DEFBR; 48 FS = DEFFS; 49 return; 50 } 51 fprintf(stderr, stat == 0 ? 52 "tip: unknown host %s\n" : 53 "tip: can't open host description file\n", host); 54 exit(3); 55 } 56 57 for (p = capstrings, q = caps; *p != NULL; p++, q++) 58 if (**q == NULL) 59 **q = rgetstr(*p, &bp); 60 if (!BR && (BR = rgetnum("br")) < 0) 61 BR = DEFBR; 62 if ((FS = rgetnum("fs")) < 0) 63 FS = DEFFS; 64 if (DU < 0) 65 DU = 0; 66 else 67 DU = rgetflag("du"); 68 if (DV == NOSTR) { 69 fprintf(stderr, "%s: missing device spec\n", host); 70 exit(3); 71 } 72 if (DU && CU == NOSTR) 73 CU = DV; 74 if (DU && PN == NOSTR) { 75 fprintf(stderr, "%s: missing phone number\n", host); 76 exit(3); 77 } 78 79 HD = rgetflag("hd"); 80 81 /* 82 * This effectively eliminates the "hw" attribute 83 * from the description file 84 */ 85 if (!HW) 86 HW = (CU == NOSTR) || (DU && equal(DV, CU)); 87 HO = host; 88 /* 89 * see if uppercase mode should be turned on initially 90 */ 91 if (rgetflag("ra")) 92 boolean(value(RAISE)) = 1; 93 if (rgetflag("ec")) 94 boolean(value(ECHOCHECK)) = 1; 95 if (rgetflag("be")) 96 boolean(value(BEAUTIFY)) = 1; 97 if (rgetflag("nb")) 98 boolean(value(BEAUTIFY)) = 0; 99 if (rgetflag("sc")) 100 boolean(value(SCRIPT)) = 1; 101 if (rgetflag("tb")) 102 boolean(value(TABEXPAND)) = 1; 103 if (rgetflag("vb")) 104 boolean(value(VERBOSE)) = 1; 105 if (rgetflag("nv")) 106 boolean(value(VERBOSE)) = 0; 107 if (rgetflag("ta")) 108 boolean(value(TAND)) = 1; 109 if (rgetflag("nt")) 110 boolean(value(TAND)) = 0; 111 if (rgetflag("rw")) 112 boolean(value(RAWFTP)) = 1; 113 if (rgetflag("hd")) 114 boolean(value(HALFDUPLEX)) = 1; 115 if (RE == NOSTR) 116 RE = (char *)"tip.record"; 117 if (EX == NOSTR) 118 EX = (char *)"\t\n\b\f"; 119 if (ES != NOSTR) 120 vstring("es", ES); 121 if (FO != NOSTR) 122 vstring("fo", FO); 123 if (PR != NOSTR) 124 vstring("pr", PR); 125 if (RC != NOSTR) 126 vstring("rc", RC); 127 if ((DL = rgetnum("dl")) < 0) 128 DL = 0; 129 if ((CL = rgetnum("cl")) < 0) 130 CL = 0; 131 if ((ET = rgetnum("et")) < 0) 132 ET = 10; 133 } 134 135 char * 136 getremote(host) 137 char *host; 138 { 139 register char *cp; 140 static char *next; 141 static int lookedup = 0; 142 143 if (!lookedup) { 144 if (host == NOSTR && (host = getenv("HOST")) == NOSTR) { 145 fprintf(stderr, "tip: no host specified\n"); 146 exit(3); 147 } 148 getremcap(host); 149 next = DV; 150 lookedup++; 151 } 152 /* 153 * We return a new device each time we're called (to allow 154 * a rotary action to be simulated) 155 */ 156 if (next == NOSTR) 157 return (NOSTR); 158 if ((cp = index(next, ',')) == NULL) { 159 DV = next; 160 next = NOSTR; 161 } else { 162 *cp++ = '\0'; 163 DV = next; 164 next = cp; 165 } 166 return (DV); 167 } 168