1 1.44 christos /* $NetBSD: externs.h,v 1.44 2018/12/14 23:40:17 christos Exp $ */ 2 1.8 thorpej 3 1.1 cgd /* 4 1.3 cgd * Copyright (c) 1988, 1990, 1993 5 1.3 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.30 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd * 31 1.6 jtk * from: @(#)externs.h 8.3 (Berkeley) 5/30/95 32 1.1 cgd */ 33 1.1 cgd 34 1.1 cgd #include <stdio.h> 35 1.4 cgd #include <stdlib.h> 36 1.1 cgd #include <setjmp.h> 37 1.1 cgd #include <sys/ioctl.h> 38 1.16 mycroft #include <errno.h> 39 1.28 itojun #include <sys/termios.h> 40 1.1 cgd 41 1.1 cgd #include <string.h> 42 1.1 cgd 43 1.14 itojun #if defined(IPSEC) 44 1.35 drochner #include <netipsec/ipsec.h> 45 1.14 itojun #if defined(IPSEC_POLICY_IPSEC) 46 1.17 itojun extern char *ipsec_policy_in; 47 1.17 itojun extern char *ipsec_policy_out; 48 1.14 itojun #endif 49 1.14 itojun #endif 50 1.14 itojun 51 1.1 cgd #ifndef _POSIX_VDISABLE 52 1.1 cgd # ifdef sun 53 1.1 cgd # include <sys/param.h> /* pick up VDISABLE definition, mayby */ 54 1.1 cgd # endif 55 1.1 cgd # ifdef VDISABLE 56 1.1 cgd # define _POSIX_VDISABLE VDISABLE 57 1.1 cgd # else 58 1.1 cgd # define _POSIX_VDISABLE ((cc_t)'\377') 59 1.1 cgd # endif 60 1.1 cgd #endif 61 1.1 cgd 62 1.1 cgd #define SUBBUFSIZE 256 63 1.1 cgd 64 1.6 jtk #include <sys/cdefs.h> 65 1.1 cgd 66 1.1 cgd extern int 67 1.1 cgd autologin, /* Autologin enabled */ 68 1.1 cgd skiprc, /* Don't process the ~/.telnetrc file */ 69 1.1 cgd eight, /* use eight bit mode (binary in and/or out */ 70 1.25 kanaoka family, /* address family of peer */ 71 1.1 cgd flushout, /* flush output */ 72 1.1 cgd connected, /* Are we connected to the other side? */ 73 1.1 cgd globalmode, /* Mode tty should be in */ 74 1.1 cgd telnetport, /* Are we connected to the telnet port? */ 75 1.1 cgd localflow, /* Flow control handled locally */ 76 1.3 cgd restartany, /* If flow control, restart output on any character */ 77 1.1 cgd localchars, /* we recognize interrupt/quit */ 78 1.6 jtk donelclchars, /* the user has set "localchars" */ 79 1.1 cgd showoptions, 80 1.1 cgd net, /* Network file descriptor */ 81 1.1 cgd tin, /* Terminal input file descriptor */ 82 1.1 cgd tout, /* Terminal output file descriptor */ 83 1.1 cgd crlf, /* Should '\r' be mapped to <CR><LF> (or <CR><NUL>)? */ 84 1.1 cgd autoflush, /* flush output when interrupting? */ 85 1.1 cgd autosynch, /* send interrupt characters with SYNCH? */ 86 1.1 cgd SYNCHing, /* Is the stream in telnet SYNCH mode? */ 87 1.1 cgd donebinarytoggle, /* the user has put us in binary */ 88 1.1 cgd dontlecho, /* do we suppress local echoing right now? */ 89 1.1 cgd crmod, 90 1.1 cgd netdata, /* Print out network data flow */ 91 1.1 cgd prettydump, /* Print "netdata" output in user readable format */ 92 1.1 cgd termdata, /* Print out terminal data flow */ 93 1.34 he telnet_debug, /* Debug level */ 94 1.15 abs doaddrlookup, /* do a reverse address lookup? */ 95 1.7 jtk clienteof; /* Client received EOF */ 96 1.1 cgd 97 1.1 cgd extern cc_t escape; /* Escape to command mode */ 98 1.1 cgd extern cc_t rlogin; /* Rlogin mode escape character */ 99 1.1 cgd #ifdef KLUDGELINEMODE 100 1.1 cgd extern cc_t echoc; /* Toggle local echoing */ 101 1.1 cgd #endif 102 1.1 cgd 103 1.1 cgd extern char 104 1.1 cgd *prompt; /* Prompt for command. */ 105 1.1 cgd 106 1.1 cgd extern char 107 1.1 cgd doopt[], 108 1.1 cgd dont[], 109 1.1 cgd will[], 110 1.1 cgd wont[], 111 1.1 cgd options[], /* All the little options */ 112 1.1 cgd *hostname; /* Who are we connected to? */ 113 1.1 cgd 114 1.19 thorpej #ifdef ENCRYPTION 115 1.23 wiz extern void (*encrypt_output)(unsigned char *, int); 116 1.23 wiz extern int (*decrypt_input)(int); 117 1.19 thorpej #endif /* ENCRYPTION */ 118 1.19 thorpej 119 1.1 cgd /* 120 1.1 cgd * We keep track of each side of the option negotiation. 121 1.1 cgd */ 122 1.1 cgd 123 1.1 cgd #define MY_STATE_WILL 0x01 124 1.1 cgd #define MY_WANT_STATE_WILL 0x02 125 1.1 cgd #define MY_STATE_DO 0x04 126 1.1 cgd #define MY_WANT_STATE_DO 0x08 127 1.1 cgd 128 1.1 cgd /* 129 1.1 cgd * Macros to check the current state of things 130 1.1 cgd */ 131 1.1 cgd 132 1.1 cgd #define my_state_is_do(opt) (options[opt]&MY_STATE_DO) 133 1.1 cgd #define my_state_is_will(opt) (options[opt]&MY_STATE_WILL) 134 1.1 cgd #define my_want_state_is_do(opt) (options[opt]&MY_WANT_STATE_DO) 135 1.1 cgd #define my_want_state_is_will(opt) (options[opt]&MY_WANT_STATE_WILL) 136 1.1 cgd 137 1.1 cgd #define my_state_is_dont(opt) (!my_state_is_do(opt)) 138 1.1 cgd #define my_state_is_wont(opt) (!my_state_is_will(opt)) 139 1.1 cgd #define my_want_state_is_dont(opt) (!my_want_state_is_do(opt)) 140 1.1 cgd #define my_want_state_is_wont(opt) (!my_want_state_is_will(opt)) 141 1.1 cgd 142 1.1 cgd #define set_my_state_do(opt) {options[opt] |= MY_STATE_DO;} 143 1.1 cgd #define set_my_state_will(opt) {options[opt] |= MY_STATE_WILL;} 144 1.1 cgd #define set_my_want_state_do(opt) {options[opt] |= MY_WANT_STATE_DO;} 145 1.1 cgd #define set_my_want_state_will(opt) {options[opt] |= MY_WANT_STATE_WILL;} 146 1.1 cgd 147 1.1 cgd #define set_my_state_dont(opt) {options[opt] &= ~MY_STATE_DO;} 148 1.1 cgd #define set_my_state_wont(opt) {options[opt] &= ~MY_STATE_WILL;} 149 1.1 cgd #define set_my_want_state_dont(opt) {options[opt] &= ~MY_WANT_STATE_DO;} 150 1.1 cgd #define set_my_want_state_wont(opt) {options[opt] &= ~MY_WANT_STATE_WILL;} 151 1.1 cgd 152 1.1 cgd /* 153 1.21 wiz * Make everything symmetrical 154 1.1 cgd */ 155 1.1 cgd 156 1.1 cgd #define HIS_STATE_WILL MY_STATE_DO 157 1.1 cgd #define HIS_WANT_STATE_WILL MY_WANT_STATE_DO 158 1.1 cgd #define HIS_STATE_DO MY_STATE_WILL 159 1.1 cgd #define HIS_WANT_STATE_DO MY_WANT_STATE_WILL 160 1.1 cgd 161 1.1 cgd #define his_state_is_do my_state_is_will 162 1.1 cgd #define his_state_is_will my_state_is_do 163 1.1 cgd #define his_want_state_is_do my_want_state_is_will 164 1.1 cgd #define his_want_state_is_will my_want_state_is_do 165 1.1 cgd 166 1.1 cgd #define his_state_is_dont my_state_is_wont 167 1.1 cgd #define his_state_is_wont my_state_is_dont 168 1.1 cgd #define his_want_state_is_dont my_want_state_is_wont 169 1.1 cgd #define his_want_state_is_wont my_want_state_is_dont 170 1.1 cgd 171 1.1 cgd #define set_his_state_do set_my_state_will 172 1.1 cgd #define set_his_state_will set_my_state_do 173 1.1 cgd #define set_his_want_state_do set_my_want_state_will 174 1.1 cgd #define set_his_want_state_will set_my_want_state_do 175 1.1 cgd 176 1.1 cgd #define set_his_state_dont set_my_state_wont 177 1.1 cgd #define set_his_state_wont set_my_state_dont 178 1.1 cgd #define set_his_want_state_dont set_my_want_state_wont 179 1.1 cgd #define set_his_want_state_wont set_my_want_state_dont 180 1.1 cgd 181 1.1 cgd 182 1.1 cgd extern FILE 183 1.1 cgd *NetTrace; /* Where debugging output goes */ 184 1.27 itojun extern char 185 1.1 cgd NetTraceFile[]; /* Name of file where debugging output goes */ 186 1.1 cgd 187 1.1 cgd extern jmp_buf 188 1.1 cgd toplevel; /* For error conditions. */ 189 1.1 cgd 190 1.1 cgd 191 1.9 christos /* authenc.c */ 192 1.23 wiz int telnet_net_write(unsigned char *, int); 193 1.23 wiz void net_encrypt(void); 194 1.23 wiz int telnet_spin(void); 195 1.23 wiz char *telnet_getenv(char *); 196 1.23 wiz char *telnet_gets(char *, char *, int, int); 197 1.9 christos 198 1.9 christos /* commands.c */ 199 1.44 christos int send_tncmd(void (*)(int, int), const char *, const char *); 200 1.23 wiz void _setlist_init(void); 201 1.23 wiz void set_escape_char(char *); 202 1.23 wiz int set_mode(int); 203 1.23 wiz int clear_mode(int); 204 1.23 wiz int modehelp(int); 205 1.23 wiz int suspend(int, char *[]); 206 1.23 wiz int shell(int, char *[]); 207 1.23 wiz int quit(int, char *[]); 208 1.23 wiz int logout(int, char *[]); 209 1.23 wiz int env_cmd(int, char *[]); 210 1.44 christos struct env_lst *env_find(const char *); 211 1.23 wiz void env_init(void); 212 1.44 christos struct env_lst *env_define(const char *, char *); 213 1.44 christos struct env_lst *env_undefine(const char *, char *); 214 1.44 christos struct env_lst *env_export(const char *, char *); 215 1.44 christos struct env_lst *env_unexport(const char *, char *); 216 1.44 christos struct env_lst *env_send(const char *, char *); 217 1.44 christos struct env_lst *env_list(const char *, char *); 218 1.44 christos char *env_default(int, int ); 219 1.44 christos char *env_getvalue(const char *); 220 1.44 christos void env_varval(const char *); 221 1.23 wiz int auth_cmd(int, char *[]); 222 1.23 wiz int ayt_status(void); 223 1.23 wiz int encrypt_cmd(int, char *[]); 224 1.23 wiz int tn(int, char *[]); 225 1.36 christos void command(int, const char *, int); 226 1.23 wiz void cmdrc(const char *, const char *); 227 1.14 itojun struct addrinfo; 228 1.9 christos 229 1.9 christos /* main.c */ 230 1.23 wiz void tninit(void); 231 1.37 joerg void usage(void) __dead; 232 1.9 christos 233 1.9 christos /* network.c */ 234 1.23 wiz void init_network(void); 235 1.23 wiz int stilloob(void); 236 1.23 wiz void setneturg(void); 237 1.23 wiz int netflush(void); 238 1.9 christos 239 1.9 christos /* sys_bsd.c */ 240 1.23 wiz void init_sys(void); 241 1.23 wiz int TerminalWrite(char *, int); 242 1.23 wiz int TerminalRead(unsigned char *, int); 243 1.23 wiz int TerminalAutoFlush(void); 244 1.23 wiz int TerminalSpecialChars(int); 245 1.23 wiz void TerminalFlushOutput(void); 246 1.23 wiz void TerminalSaveState(void); 247 1.23 wiz cc_t *tcval(int); 248 1.23 wiz void TerminalDefaultChars(void); 249 1.23 wiz void TerminalNewMode(int); 250 1.23 wiz void TerminalSpeeds(long *, long *); 251 1.23 wiz int TerminalWindowSize(long *, long *); 252 1.23 wiz int NetClose(int); 253 1.23 wiz void NetSigIO(int, int); 254 1.23 wiz void NetSetPgrp(int); 255 1.23 wiz void sys_telnet_init(void); 256 1.23 wiz int process_rings(int , int , int , int , int , int); 257 1.9 christos 258 1.9 christos /* telnet.c */ 259 1.23 wiz void init_telnet(void); 260 1.23 wiz void send_do(int, int ); 261 1.23 wiz void send_dont(int, int ); 262 1.23 wiz void send_will(int, int ); 263 1.23 wiz void send_wont(int, int ); 264 1.23 wiz void willoption(int); 265 1.23 wiz void wontoption(int); 266 1.23 wiz char **mklist(char *, char *); 267 1.23 wiz int is_unique(char *, char **, char **); 268 1.23 wiz int setup_term(char *, int, int *); 269 1.23 wiz char *gettermname(void); 270 1.23 wiz void lm_will(unsigned char *, int); 271 1.23 wiz void lm_wont(unsigned char *, int); 272 1.23 wiz void lm_do(unsigned char *, int); 273 1.23 wiz void lm_dont(unsigned char *, int); 274 1.23 wiz void lm_mode(unsigned char *, int, int ); 275 1.23 wiz void slc_init(void); 276 1.23 wiz void slcstate(void); 277 1.23 wiz void slc_mode_export(int); 278 1.23 wiz void slc_mode_import(int); 279 1.23 wiz void slc_import(int); 280 1.23 wiz void slc_export(void); 281 1.23 wiz void slc(unsigned char *, int); 282 1.23 wiz void slc_check(void); 283 1.23 wiz void slc_start_reply(void); 284 1.23 wiz void slc_add_reply(unsigned int, unsigned int, cc_t); 285 1.23 wiz void slc_end_reply(void); 286 1.23 wiz int slc_update(void); 287 1.23 wiz void env_opt(unsigned char *, int); 288 1.23 wiz void env_opt_start(void); 289 1.23 wiz void env_opt_start_info(void); 290 1.23 wiz void env_opt_add(unsigned char *); 291 1.36 christos int opt_welldefined(const char *); 292 1.23 wiz void env_opt_end(int); 293 1.23 wiz int telrcv(void); 294 1.23 wiz int rlogin_susp(void); 295 1.23 wiz int Scheduler(int); 296 1.23 wiz void telnet(const char *); 297 1.23 wiz void xmitAO(void); 298 1.23 wiz void xmitEL(void); 299 1.23 wiz void xmitEC(void); 300 1.44 christos int dosynch(const char *); 301 1.44 christos int get_status(const char *); 302 1.23 wiz void intp(void); 303 1.23 wiz void sendbrk(void); 304 1.23 wiz void sendabort(void); 305 1.23 wiz void sendsusp(void); 306 1.23 wiz void sendeof(void); 307 1.23 wiz void sendayt(void); 308 1.23 wiz void sendnaws(void); 309 1.23 wiz void tel_enter_binary(int); 310 1.23 wiz void tel_leave_binary(int); 311 1.9 christos 312 1.9 christos /* terminal.c */ 313 1.23 wiz void init_terminal(void); 314 1.23 wiz int ttyflush(int); 315 1.23 wiz int getconnmode(void); 316 1.23 wiz void setconnmode(int); 317 1.23 wiz void setcommandmode(void); 318 1.9 christos 319 1.9 christos /* utilities.c */ 320 1.23 wiz void upcase(char *); 321 1.26 christos int SetSockOpt(int, int, int, int); 322 1.44 christos void SetNetTrace(const char *); 323 1.23 wiz void Dump(int, unsigned char *, int); 324 1.36 christos void printoption(const char *, int, int ); 325 1.23 wiz void optionstatus(void); 326 1.33 dsl void printsub(int, unsigned char *, int); 327 1.23 wiz void EmptyTerminal(void); 328 1.23 wiz void Exit(int) __attribute__((__noreturn__)); 329 1.36 christos void ExitString(const char *, int) __attribute__((__noreturn__)); 330 1.1 cgd 331 1.1 cgd 332 1.28 itojun extern struct termios new_tc; 333 1.1 cgd 334 1.1 cgd # define termEofChar new_tc.c_cc[VEOF] 335 1.1 cgd # define termEraseChar new_tc.c_cc[VERASE] 336 1.1 cgd # define termIntChar new_tc.c_cc[VINTR] 337 1.1 cgd # define termKillChar new_tc.c_cc[VKILL] 338 1.1 cgd # define termQuitChar new_tc.c_cc[VQUIT] 339 1.1 cgd 340 1.1 cgd # define termSuspChar new_tc.c_cc[VSUSP] 341 1.1 cgd # define termFlushChar new_tc.c_cc[VDISCARD] 342 1.1 cgd # define termWerasChar new_tc.c_cc[VWERASE] 343 1.1 cgd # define termRprntChar new_tc.c_cc[VREPRINT] 344 1.1 cgd # define termLiteralNextChar new_tc.c_cc[VLNEXT] 345 1.1 cgd # define termStartChar new_tc.c_cc[VSTART] 346 1.1 cgd # define termStopChar new_tc.c_cc[VSTOP] 347 1.1 cgd # define termForw1Char new_tc.c_cc[VEOL] 348 1.1 cgd # define termForw2Char new_tc.c_cc[VEOL] 349 1.1 cgd # define termAytChar new_tc.c_cc[VSTATUS] 350 1.1 cgd 351 1.23 wiz # define termEofCharp &termEofChar 352 1.23 wiz # define termEraseCharp &termEraseChar 353 1.23 wiz # define termIntCharp &termIntChar 354 1.23 wiz # define termKillCharp &termKillChar 355 1.23 wiz # define termQuitCharp &termQuitChar 356 1.23 wiz # define termSuspCharp &termSuspChar 357 1.23 wiz # define termFlushCharp &termFlushChar 358 1.23 wiz # define termWerasCharp &termWerasChar 359 1.23 wiz # define termRprntCharp &termRprntChar 360 1.23 wiz # define termLiteralNextCharp &termLiteralNextChar 361 1.23 wiz # define termStartCharp &termStartChar 362 1.23 wiz # define termStopCharp &termStopChar 363 1.23 wiz # define termForw1Charp &termForw1Char 364 1.23 wiz # define termForw2Charp &termForw2Char 365 1.23 wiz # define termAytCharp &termAytChar 366