X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/c6f1b8ed877667ff8b75e5dda5a89cd54ffccfbb..055817455466c8eb60392f30bb7c689763962e17:/putty.h diff --git a/putty.h b/putty.h index 061f6275..6f62afef 100644 --- a/putty.h +++ b/putty.h @@ -36,6 +36,11 @@ typedef struct terminal_tag Terminal; * * The LATTRs (line attributes) are an entirely disjoint space of * flags. + * + * The DATTRs (display attributes) are internal to terminal.c (but + * defined here because their values have to match the others + * here); they reuse the TATTR_* space but are always masked off + * before sending to the front end. * * ATTR_INVALID is an illegal colour combination. */ @@ -45,6 +50,12 @@ typedef struct terminal_tag Terminal; #define TATTR_RIGHTCURS 0x10000000UL /* cursor-on-RHS */ #define TATTR_COMBINING 0x80000000UL /* combining characters */ +#define DATTR_STARTRUN 0x80000000UL /* start of redraw run */ + +#define TDATTR_MASK 0xF0000000UL +#define TATTR_MASK (TDATTR_MASK) +#define DATTR_MASK (TDATTR_MASK) + #define LATTR_NORM 0x00000000UL #define LATTR_WIDE 0x00000001UL #define LATTR_TOP 0x00000002UL @@ -53,7 +64,7 @@ typedef struct terminal_tag Terminal; #define LATTR_WRAPPED 0x00000010UL #define LATTR_WRAPPED2 0x00000020UL -#define ATTR_INVALID 0x03FFU +#define ATTR_INVALID 0x03FFFFU /* Like Linux use the F000 page for direct to font. */ #define CSET_OEMCP 0x0000F000UL /* OEM Codepage DTF */ @@ -80,24 +91,40 @@ typedef struct terminal_tag Terminal; */ #define UCSWIDE 0xDFFF -#define ATTR_NARROW 0x8000U -#define ATTR_WIDE 0x4000U -#define ATTR_BOLD 0x0400U -#define ATTR_UNDER 0x0800U -#define ATTR_REVERSE 0x1000U -#define ATTR_BLINK 0x2000U -#define ATTR_FGMASK 0x001FU -#define ATTR_BGMASK 0x03E0U -#define ATTR_COLOURS 0x03FFU +#define ATTR_NARROW 0x800000U +#define ATTR_WIDE 0x400000U +#define ATTR_BOLD 0x040000U +#define ATTR_UNDER 0x080000U +#define ATTR_REVERSE 0x100000U +#define ATTR_BLINK 0x200000U +#define ATTR_FGMASK 0x0001FFU +#define ATTR_BGMASK 0x03FE00U +#define ATTR_COLOURS 0x03FFFFU #define ATTR_FGSHIFT 0 -#define ATTR_BGSHIFT 5 - -#define ATTR_DEFAULT 0x0128U /* bg 9, fg 8 */ -#define ATTR_DEFFG 0x0008U -#define ATTR_DEFBG 0x0120U +#define ATTR_BGSHIFT 9 -#define ATTR_CUR_AND (~(ATTR_BOLD|ATTR_REVERSE|ATTR_BLINK|ATTR_COLOURS)) -#define ATTR_CUR_XOR 0x016AU +/* + * The definitive list of colour numbers stored in terminal + * attribute words is kept here. It is: + * + * - 0-7 are ANSI colours (KRGYBMCW). + * - 8-15 are the bold versions of those colours. + * - 16-255 are the remains of the xterm 256-colour mode (a + * 216-colour cube with R at most significant and B at least, + * followed by a uniform series of grey shades running between + * black and white but not including either on grounds of + * redundancy). + * - 256 is default foreground + * - 257 is default bold foreground + * - 258 is default background + * - 259 is default bold background + * - 260 is cursor foreground + * - 261 is cursor background + */ + +#define ATTR_DEFFG (256 << ATTR_FGSHIFT) +#define ATTR_DEFBG (258 << ATTR_BGSHIFT) +#define ATTR_DEFAULT (ATTR_DEFFG | ATTR_DEFBG) struct sesslist { int nsessions; @@ -132,6 +159,8 @@ typedef enum { TS_AYT, TS_BRK, TS_SYNCH, TS_EC, TS_EL, TS_GA, TS_NOP, TS_ABORT, TS_AO, TS_IP, TS_SUSP, TS_EOR, TS_EOF, TS_LECHO, TS_RECHO, TS_PING, TS_EOL, + /* Special command for SSH. */ + TS_REKEY, /* POSIX-style signals. (not Telnet) */ TS_SIGABRT, TS_SIGALRM, TS_SIGFPE, TS_SIGHUP, TS_SIGILL, TS_SIGINT, TS_SIGKILL, TS_SIGPIPE, TS_SIGQUIT, TS_SIGSEGV, @@ -205,6 +234,17 @@ enum { enum { /* + * SSH-2 key exchange algorithms + */ + KEX_WARN, + KEX_DHGROUP1, + KEX_DHGROUP14, + KEX_DHGEX, + KEX_MAX +}; + +enum { + /* * SSH ciphers (both SSH1 and SSH2) */ CIPHER_WARN, /* pseudo 'cipher' */ @@ -274,6 +314,16 @@ enum { FUNKY_SCO }; +enum { + /* + * Network address types. Used for specifying choice of IPv4/v6 + * in config; also used in proxy.c to indicate whether a given + * host name has already been resolved or will be resolved at + * the proxy end. + */ + ADDRTYPE_UNSPEC, ADDRTYPE_IPV4, ADDRTYPE_IPV6, ADDRTYPE_NAME +}; + struct backend_tag { const char *(*init) (void *frontend_handle, void **backend_handle, Config *cfg, @@ -300,6 +350,7 @@ struct backend_tag { * buffer is clearing. */ void (*unthrottle) (void *handle, int); + int (*cfg_info) (void *handle); int default_port; }; @@ -334,6 +385,7 @@ struct config_tag { char host[512]; int port; int protocol; + int addressfamily; int close_on_exit; int warn_on_close; int ping_interval; /* in seconds */ @@ -359,6 +411,9 @@ struct config_tag { * but never for loading/saving */ int nopty; int compression; + int ssh_kexlist[KEX_MAX]; + int ssh_rekey_time; /* in minutes */ + char ssh_rekey_data[16]; int agentfwd; int change_username; /* allow username switching in SSH2 */ int ssh_cipherlist[CIPHER_MAX]; @@ -434,6 +489,7 @@ struct config_tag { Filename logfilename; int logtype; int logxfovr; + int logflush; int logomitpass; int logomitdata; int hide_mouseptr; @@ -445,6 +501,7 @@ struct config_tag { int bidi; /* Colour options */ int ansi_colour; + int xterm_256_colour; int system_colour; int try_palette; int bold_colour; @@ -483,7 +540,7 @@ struct config_tag { /* SSH bug compatibility modes */ int sshbug_ignore1, sshbug_plainpw1, sshbug_rsa1, sshbug_hmac2, sshbug_derivekey2, sshbug_rsapad2, - sshbug_dhgex2, sshbug_pksessid2; + sshbug_pksessid2; /* Options for pterm. Should split out into platform-dependent part. */ int stamp_utmp; int login_shell; @@ -578,6 +635,7 @@ void ldisc_update(void *frontend, int echo, int edit); * shutdown. */ void update_specials_menu(void *frontend); int from_backend(void *frontend, int is_stderr, const char *data, int len); +void notify_remote_exit(void *frontend); #define OPTIMISE_IS_SCROLL 1 void set_iconic(void *frontend, int iconic); @@ -636,7 +694,6 @@ FontSpec platform_default_fontspec(const char *name); Terminal *term_init(Config *, struct unicode_data *, void *); void term_free(Terminal *); void term_size(Terminal *, int, int, int); -void term_out(Terminal *); void term_paint(Terminal *, Context, int, int, int, int, int); void term_scroll(Terminal *, int, int); void term_pwron(Terminal *); @@ -662,6 +719,7 @@ void term_provide_resize_fn(Terminal *term, void (*resize_fn)(void *, int, int), void *resize_ctx); void term_provide_logctx(Terminal *term, void *logctx); +void term_set_focus(Terminal *term, int has_focus); /* * Exports from logging.c. @@ -739,10 +797,22 @@ void luni_send(void *, wchar_t * widebuf, int len, int interactive); */ void random_add_noise(void *noise, int length); -void random_init(void); int random_byte(void); void random_get_savedata(void **data, int *len); extern int random_active; +/* The random number subsystem is activated if at least one other entity + * within the program expresses an interest in it. So each SSH session + * calls random_ref on startup and random_unref on shutdown. */ +void random_ref(void); +void random_unref(void); + +/* + * Exports from pinger.c. + */ +typedef struct pinger_tag *Pinger; +Pinger pinger_new(Config *cfg, Backend *back, void *backhandle); +void pinger_reconfig(Pinger, Config *oldcfg, Config *newcfg); +void pinger_free(Pinger); /* * Exports from misc.c. @@ -818,7 +888,7 @@ int wc_unescape(char *output, const char *wildcard); void logevent(void *frontend, const char *); void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, char *keystr, char *fingerprint); -void askcipher(void *frontend, char *ciphername, int cs); +void askalg(void *frontend, const char *algtype, const char *algname); int askappend(void *frontend, Filename filename); /* @@ -862,7 +932,7 @@ void cmdline_error(char *, ...); */ struct controlbox; void setup_config_box(struct controlbox *b, struct sesslist *sesslist, - int midsession, int protocol); + int midsession, int protocol, int protcfginfo); /* * Exports from minibidi.c. @@ -895,4 +965,39 @@ int filename_is_null(Filename fn); char *get_username(void); /* return value needs freeing */ char *get_random_data(int bytes); /* used in cmdgen.c */ +/* + * Exports and imports from timing.c. + * + * schedule_timer() asks the front end to schedule a callback to a + * timer function in a given number of ticks. The returned value is + * the time (in ticks since an arbitrary offset) at which the + * callback can be expected. This value will also be passed as the + * `now' parameter to the callback function. Hence, you can (for + * example) schedule an event at a particular time by calling + * schedule_timer() and storing the return value in your context + * structure as the time when that event is due. The first time a + * callback function gives you that value or more as `now', you do + * the thing. + * + * expire_timer_context() drops all current timers associated with + * a given value of ctx (for when you're about to free ctx). + * + * run_timers() is called from the front end when it has reason to + * think some timers have reached their moment, or when it simply + * needs to know how long to wait next. We pass it the time we + * think it is. It returns TRUE and places the time when the next + * timer needs to go off in `next', or alternatively it returns + * FALSE if there are no timers at all pending. + * + * timer_change_notify() must be supplied by the front end; it + * notifies the front end that a new timer has been added to the + * list which is sooner than any existing ones. It provides the + * time when that timer needs to go off. + */ +typedef void (*timer_fn_t)(void *ctx, long now); +long schedule_timer(int ticks, timer_fn_t fn, void *ctx); +void expire_timer_context(void *ctx); +int run_timers(long now, long *next); +void timer_change_notify(long next); + #endif