📄 ckucns.c
字号:
#include "ckcsym.h"#ifdef NOLOCALchar *connv = "";#elsechar *connv = "CONNECT Command for UNIX:select(), 7.0.110, 30 Dec 1999";/* C K U C N S -- Terminal connection to remote system, for UNIX *//* Author: Frank da Cruz <fdc@columbia.edu>, Columbia University Academic Information Systems, New York City. Copyright (C) 1985, 2000, Trustees of Columbia University in the City of New York. All rights reserved. See the C-Kermit COPYING.TXT file or the copyright text in the ckcmai.c module for disclaimer and permissions.*//* This version of the UNIX CONNECT module uses select(), which is required for Kerberos encryption. Thus it can be used only on UNIX systems that support select() on both TCP/IP and serial connections. A separate module that uses a completely portable fork() structure can be used on systems where select() is not available or does not work as required.*/#include "ckcdeb.h" /* Common things first */#ifdef OSF13#ifdef CK_ANSIC#ifdef _NO_PROTO#undef _NO_PROTO#endif /* _NO_PROTO */#endif /* CK_ANSIC */#endif /* OSF13 */#include <errno.h> /* Error numbers */#ifdef __linux__#include <sys/time.h> /* For FD_blah */#endif /* __linux__ *//* Kermit-specific includes */#include "ckcasc.h" /* ASCII characters */#include "ckcker.h" /* Kermit things */#include "ckucmd.h" /* For xxesc() prototype */#include "ckcnet.h" /* Network symbols */#ifndef NOCSETS#include "ckcxla.h" /* Character set translation */#endif /* NOCSETS */#ifdef BEBOX#include <kernel/OS.h>#include <socket.h>#include <stdio.h>#endif /* BEBOX */#include <signal.h>#ifndef SCO_OSR504#ifdef SELECT_H#include <sys/select.h>#endif /* SELECT_H */#endif /* SCO_OSR504 *//* Internal function prototypes */_PROTOTYP( VOID ttflux, (void) );_PROTOTYP( VOID doesc, (char) );_PROTOTYP( int hconne, (void) );#ifndef NOSHOW_PROTOTYP( VOID shomdm, (void) );#endif /* NOSHOW */_PROTOTYP( static int kbget, (void) );_PROTOTYP( static int ckcputf, (void) );/* External variables */extern struct ck_p ptab[];extern int local, escape, duplex, parity, flow, seslog, sessft, debses, mdmtyp, ttnproto, cmask, cmdmsk, network, nettype, sosi, tnlm, xitsta, what, ttyfd, ttpipe, quiet, backgrd, pflag, tt_crd, tn_nlm, ttfdflg, tt_escape, justone, carrier, ttpty;extern long speed;extern char ttname[], sesfil[], myhost[], *ccntab[];#ifdef TNCODEextern int tn_b_nlm, tn_rem_echo;#endif /* TNCODE */#ifdef CK_TRIGGERextern char * tt_trigger[], * triggerval;#endif /* CK_TRIGGER */extern int nopush;#ifdef CK_APCextern int apcactive; /* Application Program Command (APC) */extern int apcstatus; /* items ... */static int apclength = 0;#ifdef DCMDBUFextern char *apcbuf;#elseextern char apcbuf[];#endif /* DCMDBUF */static int apcbuflen = APCBUFLEN - 2;extern int protocol;#endif /* CK_APC */#ifndef NOXFERextern int autodl; /* Auto download */#endif /* NOXFER */#ifdef CK_AUTODLextern CHAR ksbuf[];#endif /* CK_AUTODL */#ifdef CK_ENCRYPTIONextern int me_auth;#endif /* CK_ENCRYPTION */#ifdef CK_XYZ#ifdef XYZ_INTERNALstatic int zmdlok = 1; /* Zmodem autodownloads available */#elsestatic int zmdlok = 0; /* Depends on external protocol def */#endif /* XYZ_INTERNAL */#elsestatic int zmdlok = 0; /* Not available at all */#endif /* CK_XYZ */#ifndef NOSETKEY /* Keyboard mapping */extern KEY *keymap; /* Single-character key map */extern MACRO *macrotab; /* Key macro pointer table */static MACRO kmptr = NULL; /* Pointer to current key macro */#endif /* NOSETKEY *//* Global variables local to this module */static int active = 0, quitnow = 0, /* <esc-char>Q was typed */ dohangup = 0, /* <esc-char>H was typed */ inshift = 0, /* SO/SI shift states */ outshift = 0;static char ecbuf[10], *ecbp; /* Escape char buffer & pointer */#ifdef CK_SMALL#define IBUFL 1536 /* Input buffer length */#else#define IBUFL 4096#endif /* CK_SMALL */static int obc = 0; /* Output buffer count */#ifndef OXOS#define OBUFL 1024 /* Output buffer length */#else#define OBUFL IBUFL#endif /* OXOS */#ifdef BIGBUFOK#define TMPLEN 4096 /* Temporary message buffer length */#else#define TMPLEN 200#endif /* BIGBUFOK */#ifdef DYNAMICstatic char *ibuf = NULL, *obuf = NULL, *temp = NULL; /* Buffers */#elsestatic char ibuf[IBUFL], obuf[OBUFL], temp[TMPLEN];#endif /* DYNAMIC */#ifdef DYNAMICstatic char *ibp; /* Input buffer pointer */#elsestatic char *ibp = ibuf; /* Input buffer pointer */#endif /*DYNAMIC */static int ibc = 0; /* Input buffer count */#ifdef DYNAMICstatic char *obp; /* Output buffer pointer */#elsestatic char *obp = obuf; /* Output buffer pointer */#endif /* DYNAMIC *//* Character-set items */static int unicode = 0;#ifndef NOCSETS#ifdef CK_ANSIC /* ANSI C prototypes... */extern CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(CHAR); /* Character set */extern CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(CHAR); /* translation functions */static CHAR (*sxo)(CHAR); /* Local translation functions */static CHAR (*rxo)(CHAR); /* for output (sending) terminal chars */static CHAR (*sxi)(CHAR); /* and for input (receiving) terminal chars. */static CHAR (*rxi)(CHAR);#else /* Not ANSI C... */extern CHAR (*xls[MAXTCSETS+1][MAXFCSETS+1])(); /* Character set */extern CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(); /* translation functions. */static CHAR (*sxo)(); /* Local translation functions */static CHAR (*rxo)(); /* for output (sending) terminal chars */static CHAR (*sxi)(); /* and for input (receiving) terminal chars. */static CHAR (*rxi)();#endif /* CK_ANSIC */extern int language; /* Current language. */static int langsv; /* For remembering language setting. */extern struct csinfo fcsinfo[]; /* File character set info. */extern int tcsr, tcsl; /* Terminal character sets, remote & local. */static int tcs; /* Intermediate ("transfer") character set. */static int tcssize = 0; /* Size of tcs */#ifdef UNICODE /* UTF-8 support */#ifdef CK_ANSICextern int (*xl_ufc[MAXFCSETS+1])(USHORT); /* Unicode to FCS */extern USHORT (*xl_fcu[MAXFCSETS+1])(CHAR); /* FCS to Unicode */extern int (*xuf)(USHORT); /* Translation function UCS to FCS */extern USHORT (*xfu)(CHAR); /* Translation function FCS to UCS */#elseextern int (*xl_ufc[MAXFCSETS+1])();extern USHORT (*xl_fcu[MAXFCSETS+1])();extern int (*xuf)();extern USHORT (*xfu)();#endif /* CK_ANSIC */#endif /* UNICODE */#endif /* NOCSETS */static int printing = 0;/* We do not need to parse and recognize escape sequences if we are being built without character-set support AND without APC support.*/#ifdef NOESCSEQ#ifdef XPRINT#undef XPRINT#endif /* XPRINT */#else /* NOESCSEQ not defined from outside */#ifdef NOCSETS /* No character sets */#ifndef CK_APC /* No APC */#ifndef XPRINT /* No transparent printing */#define NOESCSEQ /* So no escape sequence recognizer */#endif /* XPRINT */#endif /* CK_APC */#endif /* NOCSETS */#endif /* NOESCSEQ */static int escseq = 0; /* 1 = Recognizer is active */static int inesc[2] = { 0, 0 }; /* State of sequence recognizer */static int oldesc[2] = { -1, -1 }; /* Previous state of recognizer */#ifdef NOESCSEQ#define chkaes(x,y) 0#else/* As of edit 178, the CONNECT command skips past ANSI escape sequences to avoid translating the characters within them. This allows the CONNECT command to work correctly with a host that uses a 7-bit ISO 646 national character set, in which characters like '[' would normally be translated into accented characters, ruining the terminal's interpretation (and generation) of escape sequences. As of edit 190, the CONNECT command responds to APC escape sequences (ESC _ text ESC \) if the user SETs TERMINAL APC ON or UNCHECKED, and the program was built with CK_APC defined. Non-ANSI/ISO-compliant escape sequences are not handled.*//* States for the escape-sequence recognizer. */#define ES_NORMAL 0 /* Normal, not in an escape sequence */#define ES_GOTESC 1 /* Current character is ESC */#define ES_ESCSEQ 2 /* Inside an escape sequence */#define ES_GOTCSI 3 /* Inside a control sequence */#define ES_STRING 4 /* Inside DCS,OSC,PM, or APC string */#define ES_TERMIN 5 /* 1st char of string terminator *//* ANSI escape sequence handling. Only the 7-bit form is treated, because translation is not a problem in the 8-bit environment, in which all GL characters are ASCII and no translation takes place. So we don't check for the 8-bit single-character versions of CSI, DCS, OSC, APC, or ST. Here is the ANSI sequence recognizer state table, followed by the code that implements it. Definitions: CAN = Cancel 01/08 Ctrl-X SUB = Substitute 01/10 Ctrl-Z DCS = Device Control Sequence 01/11 05/00 ESC P CSI = Control Sequence Introducer 01/11 05/11 ESC [ ST = String Terminator 01/11 05/12 ESC \ OSC = Operating System Command 01/11 05/13 ESC ] PM = Privacy Message 01/11 05/14 ESC ^ APC = Application Program Command 01/11 05/15 ESC _ ANSI escape sequence recognizer: State Input New State ; Commentary NORMAL (start) ; Start in NORMAL state (any) CAN NORMAL ; ^X cancels (any) SUB NORMAL ; ^Z cancels NORMAL ESC GOTESC ; Begin escape sequence NORMAL other ; NORMAL control or graphic character GOTESC ESC ; Start again GOTESC [ GOTCSI ; CSI GOTESC P STRING ; DCS introducer, consume through ST GOTESC ] STRING ; OSC introducer, consume through ST GOTESC ^ STRING ; PM introducer, consume through ST GOTESC _ STRING ; APC introducer, consume through ST GOTESC 0..~ NORMAL ; 03/00 through 17/14 = Final character GOTESC other ESCSEQ ; Intermediate or ignored control character ESCSEQ ESC GOTESC ; Start again ESCSEQ 0..~ NORMAL ; 03/00 through 17/14 = Final character ESCSEQ other ; Intermediate or ignored control character GOTCSI ESC GOTESC ; Start again GOTCSI @..~ NORMAL ; 04/00 through 17/14 = Final character GOTCSI other ; Intermediate char or ignored control char STRING ESC TERMIN ; Maybe have ST STRING other ; Consume all else TERMIN \ NORMAL ; End of string TERMIN other STRING ; Still in string*/#ifdef XPRINT /* Transparent print support *//* We can't just print each byte as it comes in because then the printer-off sequence would be sent to the printer. Thus we have to buffer up escape sequences and print them only when they are complete AND we know they are not the printer-off sequence. All printing is done via zsoutx(ZMFILE,s,n). This allows for strings that contain NULs. Don't mix calls to zsoutx() with calls to zchout(), or the output will be scrambled. Also note that when printing a saved-up escape sequence, we never print its final character because that will be printed in the mainline code, upon return from chkaes(). Note that the printer-on sequence is passed to the screen; this is unavoidable, since we don't know what it is until after we get to the end, and for screen display purposes we can't buffer up escape sequences for numerous reasons. Therefore we also must output the printer-off sequence, otherwise a real terminal or emulator will be stuck in print mode.*/extern int tt_print;#define ESCBUFLEN 63static char escbuf[ESCBUFLEN+1] = { NUL, NUL };static int escbufc = 0;VOIDprinton() { /* Turn printing on */ int x, pp; char * p; extern int printpipe, noprinter; extern char * printername; if (noprinter) { debug(F110,"PRINTER ON NOPRINTER","",0); return; } p = printername; pp = printpipe; if (!p) p = ""; if (!*p) {#ifdef ANYBSD p = "lpr";#else p = "lp";#endif /* ANYBSD */ pp = 1; debug(F110,"PRINTER DEFAULT",p,0); } debug(F111,"PRINTER ON",p,pp); if (pp) { /* Printing to pipe */ x = zxcmd(ZMFILE,p); } else { /* Append to file */ struct filinfo xx; xx.bs = 0; xx.cs = 0; xx.rl = 0; xx.org = 0; xx.cc = 0; xx.typ = 0; xx.dsp = XYFZ_A; xx.os_specific = NUL; xx.lblopts = 0; x = zopeno(ZMFILE,p,NULL,&xx); } debug(F101,"PRINTER OPEN","",x); printing = 1;}VOIDprintoff() { /* Turn printing off */ int x; extern int noprinter; printing = 0; if (noprinter) { debug(F110,"PRINTER OFF NOPRINTER","",0); return; } debug(F100,"PRINTER OFF","",0); if (printing) { x = zclose(ZMFILE); debug(F101,"PRINTER CLOSE","",x); }}#endif /* XPRINT *//* C H K A E S -- Check ANSI Escape Sequence. Call with EACH character in input stream. src = 0 means c is incoming from remote; 1 = char from keyboard. Sets global inesc[src] variable according to escape sequence state. Returns 0 normally, 1 if an APC sequence is to be executed. Handles transparent printing internally.*/int#ifdef CK_ANSICchkaes(char c, int src)#elsechkaes(c,src) char c; int src;#endif /* CK_ANSIC *//* chkaes */ { debug(F111,"chkaes entry inesc",ckitoa(src),inesc[src]); debug(F101,"chkaes c","",c); if (src < 0 || src > 1) /* Don't allow bad args. */ return(0); oldesc[src] = inesc[src]; /* Remember previous state */#ifdef XPRINT if (inesc[src] && !src) { /* Save up escape seq for printing */ if (!c) return(0); /* Ignore NULs */ if (escbufc < ESCBUFLEN) { escbuf[escbufc++] = c;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -