remote.c revision 549:9e644232f978
1314564Sdim/* 2303241Sdim * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3353358Sdim * Use is subject to license terms. 4353358Sdim */ 5353358Sdim 6303241Sdim/* 7314564Sdim * Copyright (c) 1983 Regents of the University of California. 8303241Sdim * All rights reserved. The Berkeley software License Agreement 9314564Sdim * specifies the terms and conditions for redistribution. 10314564Sdim */ 11314564Sdim 12314564Sdim#pragma ident "%Z%%M% %I% %E% SMI" 13314564Sdim 14303241Sdim#include "tip.h" 15303241Sdim 16303241Sdim/* 17303241Sdim * Attributes to be gleened from remote host description 18303241Sdim * data base. 19303241Sdim */ 20314564Sdimstatic char **caps[] = { 21314564Sdim &AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI, 22314564Sdim &ES, &EX, &FO, &RC, &RE, &PA 23314564Sdim}; 24314564Sdim 25314564Sdimstatic char *capstrings[] = { 26314564Sdim "at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr", 27314564Sdim "di", "es", "ex", "fo", "rc", "re", "pa", 0 28314564Sdim}; 29314564Sdim 30314564Sdimextern char *rgetstr(char *, char **); 31314564Sdim 32314564Sdimstatic void 33314564Sdimgetremcap(char *host) 34314564Sdim{ 35314564Sdim int stat; 36314564Sdim char tbuf[BUFSIZ]; 37314564Sdim static char buf[BUFSIZ/2]; 38314564Sdim char *bp = buf; 39314564Sdim char **p, ***q; 40314564Sdim 41314564Sdim if ((stat = rgetent(tbuf, host, sizeof (tbuf))) <= 0) { 42314564Sdim if (DV || 43314564Sdim host[0] == '/' && access(DV = host, R_OK | W_OK) == 0) { 44314564Sdim /* 45314564Sdim * If the user specifies a device on the commandline, 46314564Sdim * don't trust it. 47303241Sdim */ 48303241Sdim if (host[0] == '/') 49321369Sdim trusted_device = 0; 50321369Sdim CU = DV; 51321369Sdim HO = host; 52321369Sdim HW = 1; 53321369Sdim DU = 0; 54321369Sdim if (!BR) 55321369Sdim BR = DEFBR; 56321369Sdim FS = DEFFS; 57303241Sdim RE = (char *)"tip.record"; 58303241Sdim EX = (char *)"\t\n\b\f"; 59303241Sdim DL = 0; 60303241Sdim CL = 0; 61303241Sdim ET = 10; 62303241Sdim return; 63303241Sdim } 64303241Sdim (void) fprintf(stderr, stat == 0 ? 65303241Sdim "tip: unknown host %s\n" : 66303241Sdim "tip: can't open host description file\n", host); 67303241Sdim exit(3); 68303241Sdim } 69314564Sdim 70314564Sdim for (p = capstrings, q = caps; *p != NULL; p++, q++) 71314564Sdim if (**q == NULL) 72321369Sdim **q = rgetstr(*p, &bp); 73303241Sdim if (!BR && (BR = rgetnum("br")) < 0) 74303241Sdim BR = DEFBR; 75321369Sdim if ((FS = rgetnum("fs")) < 0) 76321369Sdim FS = DEFFS; 77321369Sdim if (DU < 0) 78303241Sdim DU = 0; 79303241Sdim else 80321369Sdim DU = rgetflag("du"); 81321369Sdim if (DV == NOSTR) { 82321369Sdim (void) fprintf(stderr, "%s: missing device spec\n", host); 83321369Sdim exit(3); 84321369Sdim } 85303241Sdim if (DU && CU == NOSTR) 86303241Sdim CU = DV; 87314564Sdim if (DU && PN == NOSTR) { 88314564Sdim (void) fprintf(stderr, "%s: missing phone number\n", host); 89314564Sdim exit(3); 90314564Sdim } 91314564Sdim DB = rgetflag("db"); 92314564Sdim 93314564Sdim /* 94314564Sdim * This effectively eliminates the "hw" attribute 95303241Sdim * from the description file 96303241Sdim */ 97303241Sdim if (!HW) 98314564Sdim HW = (CU == NOSTR) || (DU && equal(DV, CU)); 99314564Sdim HO = host; 100314564Sdim /* 101314564Sdim * see if uppercase mode should be turned on initially 102314564Sdim */ 103314564Sdim if (rgetflag("ra")) 104314564Sdim boolean(value(RAISE)) = 1; 105314564Sdim if (rgetflag("ec")) 106314564Sdim boolean(value(ECHOCHECK)) = 1; 107303241Sdim if (rgetflag("be")) 108303241Sdim boolean(value(BEAUTIFY)) = 1; 109314564Sdim if (rgetflag("nb")) 110314564Sdim boolean(value(BEAUTIFY)) = 0; 111314564Sdim if (rgetflag("sc")) 112314564Sdim boolean(value(SCRIPT)) = 1; 113314564Sdim if (rgetflag("tb")) 114303241Sdim boolean(value(TABEXPAND)) = 1; 115314564Sdim if (rgetflag("vb")) 116303241Sdim boolean(value(VERBOSE)) = 1; 117314564Sdim if (rgetflag("nv")) 118314564Sdim boolean(value(VERBOSE)) = 0; 119303241Sdim if (rgetflag("ta")) 120303241Sdim boolean(value(TAND)) = 1; 121314564Sdim if (rgetflag("nt")) 122314564Sdim boolean(value(TAND)) = 0; 123303241Sdim if (rgetflag("rw")) 124 boolean(value(RAWFTP)) = 1; 125 if (rgetflag("hd")) 126 boolean(value(HALFDUPLEX)) = 1; 127 if (rgetflag("hf")) 128 boolean(value(HARDWAREFLOW)) = 1; 129 if (RE == NULL) 130 RE = (char *)"tip.record"; 131 if (EX == NULL) 132 EX = (char *)"\t\n\b\f"; 133 if (ES != NOSTR) 134 (void) vstring("es", ES); 135 if (FO != NOSTR) 136 (void) vstring("fo", FO); 137 if (PR != NOSTR) 138 (void) vstring("pr", PR); 139 if (RC != NOSTR) 140 (void) vstring("rc", RC); 141 if ((DL = rgetnum("dl")) < 0) 142 DL = 0; 143 if ((CL = rgetnum("cl")) < 0) 144 CL = 0; 145 if ((ET = rgetnum("et")) < 0) 146 ET = 10; 147} 148 149char * 150getremote(char *host) 151{ 152 char *cp; 153 static char *next; 154 static int lookedup = 0; 155 156 if (!lookedup) { 157 if (host == NOSTR && (host = getenv("HOST")) == NOSTR) { 158 (void) fprintf(stderr, "tip: no host specified\n"); 159 exit(3); 160 } 161 getremcap(host); 162 next = DV; 163 lookedup++; 164 } 165 /* 166 * We return a new device each time we're called (to allow 167 * a rotary action to be simulated) 168 */ 169 if (next == NOSTR) 170 return (NOSTR); 171 if ((cp = strchr(next, ',')) == NULL) { 172 DV = next; 173 next = NOSTR; 174 } else { 175 *cp++ = '\0'; 176 DV = next; 177 next = cp; 178 } 179 return (DV); 180} 181